首页 > 解决方案 > 在 Rcpp 函数中停止(作为包的一部分)以调试模式结束

问题描述

我正在测试stop包 using 中的使用Rcpp,我看到使用时stop,函数退出到R. 例如,我在这个链接上使用示例函数(见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消息并且控制返回到控制台但不进入调试模式。

任何帮助将不胜感激!

PS:我刚刚发现通过使用Rf_error而不是stop. 任何人都可以提供一个明智的意见,至于哪个是首选?谢谢你。

标签: rcppr-package

解决方案


第二个问题: 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。


推荐阅读