在 R 中使用 parSapply() 并行化时如何导出具有修改值的全局变量

How to export global variable with modified values when using parallelization in R with parSapply()

我正在使用 R 中“并行”包中的 parSapply 来优化计算量大的代码。该代码运行良好,最终答案与我的代码的串行版本相同。唯一的问题是我有一个全局变量,其值在代码期间发生变化,但 parSapply 函数无法将更改应用于全局变量。这是一个简单的例子:

M = matrix(1,5,5)
test = function(x){
M[x,x] <<- x
}

sapply(c(1:5), function(x) test(x))
M
no_of_cores = detectCores()
cl = makeCluster(no_of_cores)
clusterExport(cl, varlist = c("test","M"), envir=environment())
parSapply(cl, c(1:5), function(x) test(x))
M

当我使用sapply函数时,M的值修改正确,但是当我使用parSapply时,M没有改变!我感谢解决此问题的任何建议!谢谢

我们可以用foreach

library(doSNOW)
library(parallel)
no_of_cores = detectCores()
cl <- makeSOCKcluster(no_of_cores)
registerDoSNOW(cl)
M <- matrix(1,5,5)

comb <- function(m, ...) {
  for (r in list(...)) {
    m[r$k, r$k] <- r$k
  }
  m
}

out <- foreach(k=1:5, .combine='comb', .init=M,
          .multicombine=TRUE) %dopar% {
    m <- M  
     list(k=k, m=m)
  }

-输出

out
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    1    2    1    1    1
[3,]    1    1    3    1    1
[4,]    1    1    1    4    1
[5,]    1    1    1    1    5