2

我尝试优化模拟脚本的某些部分并使其部分并行运行。所以我发现了这个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 的值放在 dataframes 的第 m 行A,B & C。在我的脚本中,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

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

4

1 回答 1

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 小插图对此类事情非常有帮助。

于 2021-07-12T03:07:22.170 回答