我试图在不使用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。

10-05 22:15