0

我对如何使用 Rcpp 包感到困惑。在保存以下 .cpp 代码后,使用 newRcppVectorExample 的 R 函数的 R 代码是什么,例如 example.cpp?代码来自http://dirk.eddelbuettel.com/code/rcpp.examples.html

我必须创建一个包吗?我可以直接使用example.cpp吗?例如 R CMD SHLIB example.cpp,然后使用 dyn.load 函数。

#include <RcppClassic.h>
#include <cmath>

RcppExport SEXP newRcppVectorExample(SEXP vector) {
BEGIN_RCPP

Rcpp::NumericVector orig(vector);                          
Rcpp::NumericVector vec(orig.size());                

std::transform(orig.begin(), orig.end(), vec.begin(), ::sqrt);

return Rcpp::List::create(Rcpp::Named( "result" ) = vec,
                          Rcpp::Named( "original" ) = orig) ;

END_RCPP
}
4

1 回答 1

2

您可能想花一些时间阅读文档,包括 R 本身(即编写 R 扩展)和 Rcpp,您可以从 Rcpp-introduction vignette(这也是我们的统计软件期刊论文)开始。

简而言之,一个扩展 R 通过.Call()可以访问通过包加载的编译代码的函数,或通过dyn.load(). 但是我在这里复制这些材料没有什么意义。

编辑:鉴于您找到了在RcppExamples包中显示的示例,以下是它在同一个包中的调用方式:

RcppVectorExample <- function(vec=seq(1,9)^2, api=c("classic", "new")) {

    api <- match.arg(api)               # match to classic or new
    fun <- paste(api, "RcppVectorExample", sep="")

    ## Make the call...
    val <- .Call(fun,                   # either new or classic
                 vec,
                 PACKAGE="RcppExamples")

    val
}

这比通常情况稍微复杂一些,因为我们可以从旧的和已弃用的 API(仍然由RcppClassic包提供)或新的 API(您为其选择代码)调用示例。

关键是它.Call()与命名的 C++ 函数的第一个参数一起使用,然后是一组参数和一个指向共享库所在包的最后一个参数。

于 2012-09-22T01:34:56.723 回答