在R&的PAR*中使用RCPP函数应用并行包中的函数 [英] Using Rcpp functions inside of R's par*apply functions from the parallel package

查看:22
本文介绍了在R&的PAR*中使用RCPP函数应用并行包中的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图了解在并行环境上的Rcpp::sourceCpp()调用背后发生了什么。最近,问题Using Rcpp function in parLapply on Windows部分解决了这一问题。

在这篇帖子里,德克说,

"您需要在每个派生的进程中运行sourceCpp()调用,或者让它们获得您的代码。"

这是对提问者使用将RCPP函数分发到工作进程的响应。提问者正在通过以下方式发送RCPP函数:

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

我搞不懂为什么这个不起作用。我的想法是,这就是clusterExport()的目标。

推荐答案

此处的问题在于,由于二进制文件链接到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)

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

因此,将编译后的代码嵌入到包中然后分发包始终是理想的做法。

这篇关于在R&amp;的PAR*中使用RCPP函数应用并行包中的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆