网站建设印花税税率,营销型网站的布局,百度网站的网址是什么,wordpress会员收费权限目录 方案一#xff1a;C函数在R包中
方案二#xff1a;C函数在本地#xff0c;通过Rcpp::sourceCpp(fun_name.cpp)使用
方案三#xff1a;将C函数写在当前脚本中
题外话#xff1a;为什么要研究foreachRcpp?
本文参考#xff1a; 问题#xff1a;在fo…目录 方案一C函数在R包中
方案二C函数在本地通过Rcpp::sourceCpp(fun_name.cpp)使用
方案三将C函数写在当前脚本中
题外话为什么要研究foreachRcpp?
本文参考 问题在foreach中使用Rcpp的函数无法工作
相关问题描述链接 cl - makePSOCKcluster(8) registerDoParallel(cl) rows - foreach(i1:8,.combinerbind,.packagesmyPackage) %dopar% multiGenerateCSVrow(scoreMatrixNIsample, validMatrix matrix(1,nrow10,ncol10), cutoffVector rep(0,10), factorVector randomsCutPlus1[i,], actualVector rep(1,10), scaleSample 1) stopCluster(cl) ~ Error in multiGenerateCSVrow(scoreMatrix NIsample, validMatrix matrix(1, : task 1 failed - NULL value passed as symbol address 中文错误NULL值不能当作符号地址用 expression 英文错误NULL value passed as symbol address 如何将foreach和Rcpp结合起来呢有如下解决方案
方案一C函数在R包中
正如Patrick McCarthy所建议的那样将C函数放在一个包中安装并加载了该包并将其传递给并行运算函数forearch的参数 . packs…
这种方法使用的前提要将C函数封装在一个R包中。如果是别人包中的c函数可以直接使用这种方式如果是自己编写的C函数这种方式过于复杂复杂原因在于需要打包成一个R函数麻烦一些。 方案二C函数在本地通过Rcpp::sourceCpp(fun_name.cpp)使用
不需要将C函数存放在一个R包中只需要在foreach函数中添加两行语句即可
library(Rcpp) #加载Rcpp包因为sourceCpp()函数是Rcpp中的函数sourceCpp(fun_name.cpp) #存放在的C函数
注在ParLapply中使用C函数也可以通过上述方式将上述语句放在parLapply(, fun)函数中的 fun中相当于让每个结点都可以加载这个C函数。
其中foreach()函数循环体内的 library(Rcpp) 可以替换成foreach(..., .packsRcpp) 。
下面是个例子
cl makeCluster(n_cores, outfile)
registerDoParallel(cl)foreach(n 1:N,.packages Rcpp,.noexport name of Rccp function)%dopar%{source(Scripts/Rccp_functions.R)### do stuff with functions scripted in Rccp_functions.R
}stopImplicitCluster() 方案三将C函数写在当前脚本中 在foreach函数中添加参数 .noexport c(Functions that were implemented in C) 可能原因C函数从全局环境导入到并行中但是由于它们不是普通的函数它们实际上并不起作用。这确实意味着这些C函数必须在每个节点上单独加载在我的例子中这是一个SNOW clusterCall调用它获取了各种文件包括C代码。
可参考
worker.init - function() {library(inline)sigFunc - signature(xnumeric, size_xnumeric)code - double tot 0;for(int k 0; k INTEGER(size_x)[0]; k){tot REAL(x)[k];};return ScalarReal(tot);assign(cFunc, cxxfunction(sigFunc, code), .GlobalEnv)NULL
}f1 - function(){x - rnorm(100)a - cFunc(xx, size_xas.integer(length(x)))return(a)
}library(foreach)
library(doParallel)
cl - makePSOCKcluster(3)
clusterCall(cl, worker.init)
registerDoParallel(cl)
res - foreach(counter1:100) %dopar% f1()
题外话为什么要研究foreachRcpp?
明明parLapplyRcpp可以使用了执行并行的时候用parLapplyRcpp就好。但是有些时候循环体中某次循环会坏掉这种时候希望让程序跳过坏掉的次数继续执行下去这样避免了因为某次循环换掉导致前面运行的都废掉了花费的时间也白费了。而foreach函数中有一个好的参数 .errorhandling c(stop, remove, pass), 设置.errorhandingpass,这样当某次循环因为某些原因坏掉时程序自动跳过这次循环然后继续运行最终返回所有循环的值。
关于foreach函数的介绍可以看使用foreach函数_饮食有度的元气少女的博客-CSDN博客 本文参考
r - Cant run Rcpp function in foreach - Stack Overflow