带c+的R包+;(不含Rcpp) 我试图用C++来构建一个R包,而不用RCPP(我知道Rcpp工作得很好)。我已经阅读了一些R软件包教程,并简要阅读了编写R扩展。下面的示例1)正在工作,但示例2)使R崩溃。我想知道为什么会发生这种情况(是否有为R等编写函数的先决步骤?) 例1
在带c+的R包+;(不含Rcpp) 我试图用C++来构建一个R包,而不用RCPP(我知道Rcpp工作得很好)。我已经阅读了一些R软件包教程,并简要阅读了编写R扩展。下面的示例1)正在工作,但示例2)使R崩溃。我想知道为什么会发生这种情况(是否有为R等编写函数的先决步骤?) 例1,c++,r,package,C++,R,Package,在.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). .Call("RHello"). 这个
.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).
.Call("RHello").
这个例子很有效
例2
在.cpp
文件中:
extern "C" {
void RHello() {
Rprintf("Hello.\n");
R_FlushConsole();
R_ProcessEvents();
}
}
呼叫R:
.Call("add", 3.0, 2.0).
.Call("RHello").
这会使R崩溃。函数的签名在第二种情况下是错误的(void return value),它需要返回一个SEXP对象。即使那只是R_nil的价值 我希望您有充分的理由不使用Rcpp