R代码使用.cpp文件中的函数,基于Rcpp包

时间:2012-09-22 01:28:40

标签: r rcpp

我对如何使用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
}

1 个答案:

答案 0 :(得分:2)

您可能希望花一些时间阅读R本身(即Writing R Extensions)和Rcpp的文档,您可以从Rcpp介绍插图(也是我们的Journal of Statistical Software paper)开始。

简而言之,可以通过.Call()函数扩展R,该函数可以访问通过包加载的编译代码,或通过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 ++函数的第一个参数一起使用,后跟一组参数和一个指向找到共享库的包的最终参数。