我试图在不使用Rcpp的情况下使用c++构建R包(我知道Rcpp的运行非常出色)。我已经阅读了一些R包教程,并简要阅读了编写R扩展。下面的示例1)正在运行,但是示例2)使R崩溃。我想知道为什么会这样(是否有任何必要的步骤为R等编写函数...?)。
例子1
在.cpp
文件中
extern "C" {
SEXP add(SEXP a, SEXP b) {
SEXP result = PROTECT(allocVector(REALSXP, 1));
REAL(result)[0] = asReal(a) + asReal(b);
UNPROTECT(1);
return result;
}
}
致电R:
.Call("add", 3.0, 2.0).
这个例子有效。
例子2
在
.cpp
文件中:extern "C" {
void RHello() {
Rprintf("Hello.\n");
R_FlushConsole();
R_ProcessEvents();
}
}
致电R:
.Call("RHello").
这使R崩溃。
最佳答案
在第二种情况下,该函数的签名是错误的(没有返回值),它需要返回一个SEXP对象。即使那只是R_NilValue。
希望您有充分的理由不使用Rcpp。