R doRNG无法找到变量

时间:2017-05-16 17:59:09

标签: r foreach doparallel

在注册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"

1 个答案:

答案 0 :(得分:0)

  

我的总体目标是使用doRNG来确保我的并行   进程获得不同的随机数流,所以如果有的话   更好的方法,这也将解决我的问题。

如果你能&#34;改写&#34;你在lapply()电话中遇到问题,那么

y <- future_lapply(x, FUN, ..., future.seed = TRUE)
future包中的

(我是作者)将确保使用正确的(L&#39; Ecuyer-CMRG)RNG流完成每个FUN(x[[i]], ...)呼叫。未来的包还会自动处理全局变量(例如gVarlclVar)正确导出到每个工作者。

您可以控制与plan()功能并行化的方式,例如

cl <- makePSOCKcluster(2)
plan(cluster, workers = cl)

相当于:

plan(multiprocess, workers = 2L)

这在所有操作系统上都是一样的。