在 R 中如何在 运行 并行时为 foreach() 函数定义组合函数

In R how to define a combine function for foreach() function when running parallel

我想做一个排列测试,这是代码的结构(带有虚拟数据)。排列将 运行 并行,并希望计算生成的矩阵未通过测试的次数。 (参见代码块 2)。但这在块 2 中很慢,因为它在单个处理器中工作。我想编写一个 .combine 函数来配合 foreach() 函数,但我不知道如何提供输入参数(cc 和矩阵)

library(foreach)
library(parallel)

#matrix to be populated
cc<-matrix(0,nrow = 10,ncol = 10)

#fixed matrix
a<-matrix(runif(100), ncol=10)

iters<-1e3
cl<-makeCluster(8)
registerDoParallel(cl)


ls<-foreach(icount(iters)) %dopar% {
#generated matrix
  b<-matrix(runif(100), ncol=10)
  b
 }


stopCluster(cl)

这部分是问题所在。我想计算矩阵 b 的每个元素大于固定矩阵 a 的次数,并将每个元素的计数添加到 cc 矩阵。如果我可以定义一个 .combine 函数,那么它应该在生成每个矩阵时执行。

for(b in ls){
  for(i in 1:dim(a)[1]) {
    for(j in 1:dim(a)[2]) {
      if(a[i,j] < b[i,j]) cc[i,j]=cc[i,j] + 1

     }
   }
}

cc

关于,"I don't know how to give the input parameters(cc and a matrices)"

我认为 .export 可以像文档中提到的那样解决您的问题。

顺便说一句,for 循环中的任何变量都将自动导出到从属处理器,因此在您的示例中,矩阵 abcc 可以是在 %dopar%.

下作为串行代码运行

.export
character vector of variables to export. This can be useful when accessing a variable that isn't defined in the current environment. The default value in NULL.

foreach 的另一个例子可以在 here 中找到。


关于,"If i can define a .combine function this should execute when each matrix is generated."

是的,您可以将函数定义为普通 R 函数并传递给 .combine=your_func,它将在从属进程返回后调用。

here.

中的示例