我对如何使用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
}
答案 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 ++函数的第一个参数一起使用,后跟一组参数和一个指向找到共享库的包的最终参数。