我正在尝试了解Rcpp::sourceCpp()
调用并行环境背后的情况。最近,问题部分解决了这个问题:Using Rcpp function in parLapply on Windows。
在这篇文章中,德克说,
“你需要在每个衍生进程中运行sourceCpp()调用,否则就会得到你的代码。”
这是对提问者使用 Rcpp 函数分配给工作进程的回应。提问者通过以下方式发送 Rcpp 功能:
clusterExport(cl = cl, varlist = "payoff")
我很困惑为什么这不起作用。我的想法是,这就是clusterExport()
的目标。
答案 0 :(得分:4)
这里的问题是,由于二进制文件如何链接到 R 的进程中,编译后的代码不会被“导出”到生成的进程而不会嵌入到包中。
传统上,clusterExport()
语句允许将 R 特定代码分发给员工。
在Rcpp函数上使用clusterExport()
,您只接收 R 声明,不底层共享库。也就是说,Attributes.R中给出的R CMD SHLIB
不与工人共享/出口。因此,当对工作人员的Rcpp
函数进行调用时, R 找不到正确的共享库。
采用上一个问题的功能:
Rcpp::cppFunction("NumericVector payoff( double strike, NumericVector data) {
return pmax(data - strike, 0);
}")
注意:我使用cppFunction()
代替sourceCpp()
,但结果等效,因为cppFunction()
calls sourceCpp()
to create the function。
输入功能名称:
payoff
使用共享库指针生成 R 声明。
function (strike, data)
.Primitive(".Call")(<pointer: 0x1015ec130>, strike, data)
此共享库仅适用于编译函数的过程。
因此,为什么将编译后的代码嵌入到包中然后分发包中总是理想的。