我们知道Rf_error()
在 Rcpp 中应该避免调用,因为它涉及堆栈上 C++ 析构函数的 longjmp。这就是为什么我们宁愿在 Rcpp 代码中抛出 C++ 异常(如throw Rcpp::exception("...")
或通过stop("...")
函数)。
但是,R 警告也可能导致调用Rf_error()
(此行为取决于warn
选项)。因此,调用 toRf_warning()
也是有风险的。
Rcpp::sourceCpp(code = '
#include <Rcpp.h>
using namespace Rcpp;
class Test {
public:
Test() { Rcout << "start\\n"; }
~Test() { Rcout << "end\\n"; }
};
// [[Rcpp::export]]
void test() {
Test t;
Rf_warning("test");
}
')
options(warn=10)
test()
## start
## Error in test() : (converted from warning) test
我们看到没有调用析构函数(没有“结束”消息)。
如何以 C++ 析构函数友好的方式生成 R 警告?