在R的par *中使用Rcpp函数应用并行包中的函数

时间:2016-07-22 04:50:37

标签: r parallel-processing rcpp

我正在尝试了解Rcpp::sourceCpp()调用并行环境背后的情况。最近,问题部分解决了这个问题:Using Rcpp function in parLapply on Windows

在这篇文章中,德克说,

  

“你需要在每个衍生进程中运行sourceCpp()调用,否则就会得到你的代码。”

这是对提问者使用 Rcpp 函数分配给工作进程的回应。提问者通过以下方式发送 Rcpp 功能:

clusterExport(cl = cl, varlist = "payoff")

我很困惑为什么这不起作用。我的想法是,这就是clusterExport()的目标。

1 个答案:

答案 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)

此共享库仅适用于编译函数的过程。

因此,为什么将编译后的代码嵌入到包中然后分发包中总是理想的。