带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