Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R'内使用Rcpp函数;s par*应用并行包中的函数_R_Parallel Processing_Rcpp - Fatal编程技术网

在R'内使用Rcpp函数;s par*应用并行包中的函数

在R'内使用Rcpp函数;s par*应用并行包中的函数,r,parallel-processing,rcpp,R,Parallel Processing,Rcpp,我试图理解在并行化环境中调用Rcpp::sourceCpp()后发生了什么。最近,这一问题在以下问题中得到了部分解决: 德克说,在这篇文章中 您需要在每个生成的进程中运行sourceCpp()调用,或者将它们作为您的代码 这是对提问者将Rcpp功能分配给工作进程的回应。提问者通过以下方式发送Rcpp功能: clusterExport(cl = cl, varlist = "payoff") 我不明白为什么这不起作用。我的想法是,这就是clusterExport()的目标。这里的问题是,由于二进

我试图理解在并行化环境中调用
Rcpp::sourceCpp()
后发生了什么。最近,这一问题在以下问题中得到了部分解决:

德克说,在这篇文章中

您需要在每个生成的进程中运行sourceCpp()调用,或者将它们作为您的代码

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

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

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

这里的问题是,由于二进制文件如何链接到R的进程中,编译后的代码在不嵌入包的情况下无法“导出”到衍生进程

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

通过对Rcpp函数使用
clusterExport()
,您只会收到R声明,而不会收到底层共享库。也就是说,中给出的
R CMD SHLIB
不与工人共享/导出给工人。因此,当调用worker上的
Rcpp
函数时,R无法找到正确的共享库

以上一个问题的功能为例:

Rcpp::cppFunction("NumericVector payoff( double strike, NumericVector data) {
    return pmax(data - strike, 0);
}")
注意:我使用的是
cppFunction()
而不是
sourceCpp()
,但是结果是等效的

键入函数名:

payoff
生成带有共享库指针的R声明

function (strike, data) 
.Primitive(".Call")(<pointer: 0x1015ec130>, strike, data)
功能(罢工、数据)
.Primitive(“.Call”)(、罢工、数据)
此共享库仅在编译了函数的进程上可用


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

这里的问题是,由于二进制文件如何链接到R的进程中,编译后的代码在没有嵌入包的情况下无法“导出”到衍生进程

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

通过对Rcpp函数使用
clusterExport()
,您只会收到R声明,而不会收到底层共享库。也就是说,中给出的
R CMD SHLIB
不与工人共享/导出给工人。因此,当调用worker上的
Rcpp
函数时,R无法找到正确的共享库

以上一个问题的功能为例:

Rcpp::cppFunction("NumericVector payoff( double strike, NumericVector data) {
    return pmax(data - strike, 0);
}")
注意:我使用的是
cppFunction()
而不是
sourceCpp()
,但是结果是等效的

键入函数名:

payoff
生成带有共享库指针的R声明

function (strike, data) 
.Primitive(".Call")(<pointer: 0x1015ec130>, strike, data)
功能(罢工、数据)
.Primitive(“.Call”)(、罢工、数据)
此共享库仅在编译了函数的进程上可用


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

因此,如果我将我的一个.cpp文件添加到包中,并使用clusterEvalQ将其导出给工作人员,应该可以解决我的问题?是的,因为包处理编译后的代码的包装。谢谢您的清理。我开始四处寻找用单个文件制作包的简单方法。你有推荐的资源吗?我接受了答案,并试图提高投票率,但我没有足够的声誉。谢谢你的帮助!在我的教程幻灯片中有很多使用单个文件制作包的示例。从
Rcpp.package.skeleton()
开始,最好安装pkgKitten,或者使用RStudio中内置的包骨架生成器(并选择“包w/Rcpp”)。因为每次你用devtools$Dedity创建一个包时,都会杀死一只小猫。只是开玩笑。回答得很好,否则就说到了(非常重要的)一点。所以,如果我将我的一个.cpp文件添加到一个包中,并使用clusterEvalQ将其导出到workers,应该可以解决我的问题了?是的,因为包处理编译代码的包装。感谢您的清理。我开始四处寻找用单个文件制作包的简单方法。你有推荐的资源吗?我接受了答案,并试图提高投票率,但我没有足够的声誉。谢谢你的帮助!在我的教程幻灯片中有很多使用单个文件制作包的示例。从
Rcpp.package.skeleton()
开始,最好安装pkgKitten,或者使用RStudio中内置的包骨架生成器(并选择“包w/Rcpp”)。因为每次你用devtools$Dedity创建一个包时,都会杀死一只小猫。只是开玩笑。回答得很好,否则就说到了(非常重要的)一点。向上投票。