将for循环转换为R中的并行foreach循环

时间:2015-10-27 10:10:56

标签: r foreach parallel-processing parallel-foreach

我尝试优化模拟脚本的各个部分,并使其中的一部分并行运行。所以我发现了foreach函数。 作为一个例子,我尝试并行运行

Wiederholungen<-4
assign("A",array(0,c(Wiederholungen,10,3)))
assign("B",array(0,c(Wiederholungen,10,3)))
assign("C",array(0,c(Wiederholungen,10,3)))

旧代码:

for(m in 1:Wiederholungen){
  A[m,,]<-m

  B[m,,]<-m

  C[m,,]<-m
}

导致:(对于A)

A
, , 1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    1    1    1     1
[2,]    2    2    2    2    2    2    2    2    2     2
[3,]    3    3    3    3    3    3    3    3    3     3
[4,]    4    4    4    4    4    4    4    4    4     4

, , 2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    1    1    1     1
[2,]    2    2    2    2    2    2    2    2    2     2
[3,]    3    3    3    3    3    3    3    3    3     3
[4,]    4    4    4    4    4    4    4    4    4     4

, , 3

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    1    1    1     1
[2,]    2    2    2    2    2    2    2    2    2     2
[3,]    3    3    3    3    3    3    3    3    3     3
[4,]    4    4    4    4    4    4    4    4    4     4

这应该将m的值放在数据帧A,B & C的第m行中。在我的脚本中,m是脚本应该运行的重复次数(Wiederholungen)。

Foreach代码:

foreach(m=1:Wiederholungen)%dopar%{
    A[m,,]<-m

    B[m,,]<-m

    C[m,,]<-m
}

导致:

[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

但这不会导致数据帧A,B,C的上述结果。我知道foreach有一个combine选项,但是如果你有一个矩阵的结果而不是我的例子中的几个,那么似乎只能工作。如何使用并行处理方法获得与旧的for循环相同的结果。我使用的是Ubuntu和3.2.2。

1 个答案:

答案 0 :(得分:0)

我知道这是一篇很老的帖子,但我认为答案可能会在未来对某人有所帮助。

Foreach 只返回在循环中创建的最后一个对象的列表。因此,如果您希望返回 A、B 和 C,则需要将它们列为循环的最后一步。 此代码适用于我。

W<- foreach(m = 1:Wiederholungen) %dopar% {

A[m,,]<-m

B[m,,]<-m

C[m,,]<-m

list(A, B, C)
}

为了将来参考,foreach 插图对此类事情非常有帮助。