在 Rcpp 函数中停止(作为包的一部分)在调试模式下结束

stop in Rcpp function (as a part of a package) ends in debug mode

我正在使用 Rcpp 测试包中 stop 的使用,我发现当使用 stop 时,函数在 R 中退出并进入调试模式.例如,我在 link 处使用示例函数(参见 takeLog3 函数,也粘贴在下面)

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
double takeLog3(double val) {
    if (val <= 0.0) {           // log() not defined here
        stop("Inadmissible value");
    }
    return log(val);
}

takeLog3(-10)的输出是

> takeLog3(-10)
Error in takeLog3(-10) : Inadmissible value
Called from: takeLog3(-10)
Browse[1]> 

然后我必须输入 Q 才能退出调试模式。我的问题是,这是预期的行为吗?其次,如何使 stop 语句不进入调试模式,而是在显示 stop 消息后完全退出该功能?

请注意,当 takeLog3 包含在包中时,我看到了这种行为。当我在一个简单的 .cpp 文件中的包外部使用此功能时,我没有看到此行为,其中该功能仅显示 stop 消息并控制 returns 返回控制台但是不会进入调试模式。

非常感谢任何帮助!

PS:我刚刚发现使用 Rf_error 而不是 stop 可以获得我需要的行为。任何人都可以提供一个明智的意见,至于哪个是首选?谢谢。

第二个问题:stop() 调用 Rf_error() 来实现您看到的行为。

第一个问题:您最终进入调试器是因为 IDE(您没有提及或提及)想要提供帮助。在标准 R shell:

的命令行上尝试
R> Rcpp::cppFunction("bool myStop(std::string reason) { Rcpp::stop(reason); }")
R> myStop("tired")
Error in myStop("tired") : tired
R> 

Ubuntu 18.10, R 3.6.0.