在 R 的 par*apply 函数中使用 Rcpp 函数

Using Rcpp functions inside of R's par*apply functions from the parallel package

我试图了解在并行化环境中 Rcpp::sourceCpp() 调用背后发生的事情。最近,这个问题在以下问题中得到了部分解决:Using Rcpp function in parLapply on Windows.

在这个post中,德克说,

"You need to run the sourceCpp() call in each spawned process, or else get them your code."

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

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

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

这里的问题是,由于二进制文件链接到 R 的方式,编译后的代码不会 "exportable" 在没有嵌入包中的情况下生成进程过程。

传统上,clusterExport() 语句允许将 R 特定代码分发给工作人员。

通过在 Rcpp 函数上使用 clusterExport(),您只会收到 R 声明和 而不是 底层共享库.也就是说,Attributes.R中给出的R CMD SHLIB不共享/导出给worker。结果,当调用 worker 上的 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)

此共享库仅在编译函数的进程中可用。

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