2012-09-22 42 views
0

我对如何使用Rcpp包感到困惑。在保存以下.cpp代码之后,什么是使用newRcppVectorExample的R函数的R代码,example.cpp表示?代码是从http://dirk.eddelbuettel.com/code/rcpp.examples.htmlR代码使用.cpp文件中的函数,基于Rcpp包

我需要创建一个包吗?我可以直接使用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 
} 

回答

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++函数的第一个参数一起使用,后跟一组参数,最后一个参数指向找到共享库的包。

相关问题