在注册dopar
时,我遇到了在函数内运行doRNG
的问题,我需要访问函数内部创建的变量。
我的总体目标是使用doRNG
来确保我的并行进程获得不同的随机数流,因此如果有更好的方法,这也将解决我的问题。
我对次要使用doRNG
失败的原因感兴趣,因为我试图了解如何将环境导出到并行进程。
这里的代码看起来有点人为,但这总结了一个更大更复杂的代码。
library(doParallel)
library(foreach)
cl <- makePSOCKcluster(2)
registerDoParallel(cl)
#if I comment out these two lines, code runs fine
library(doRNG)
registerDoRNG()
gVar <- 'gVar'
cols <- matrix(1:10,nrow=2)
res <- apply(cols,2,
function(col) {
lclVar <- sum(col)
res <- foreach(i=icount(2),
.export=c('gVar'), #'lclVar'
.combine='c') %dopar% { #change to %do% also works
return(sprintf('%s %s %s',gVar,lclVar,i))
}
return(res)
})
print(res)
stopCluster(cl)
请注意,如果我注释掉doRNG
行,则代码运行正常。也可以从%dopar%
更改为%do%
(并且doRNG
行未注释)。
我得到以下内容:
Error in { : task 1 failed - "object 'lclVar' not found"
答案 0 :(得分:0)
我的总体目标是使用doRNG来确保我的并行 进程获得不同的随机数流,所以如果有的话 更好的方法,这也将解决我的问题。
如果你能&#34;改写&#34;你在lapply()
电话中遇到问题,那么
y <- future_lapply(x, FUN, ..., future.seed = TRUE)
future包中的(我是作者)将确保使用正确的(L&#39; Ecuyer-CMRG)RNG流完成每个FUN(x[[i]], ...)
呼叫。未来的包还会自动处理全局变量(例如gVar
和lclVar
)正确导出到每个工作者。
您可以控制与plan()
功能并行化的方式,例如
cl <- makePSOCKcluster(2)
plan(cluster, workers = cl)
相当于:
plan(multiprocess, workers = 2L)
这在所有操作系统上都是一样的。