【问题标题】:Translate for loop into parallel foreach loop in R将 for 循环转换为 R 中的并行 foreach 循环
【发布时间】:2016-01-26 16:37:09
【问题描述】:

我尝试优化模拟脚本的某些部分并使其部分并行运行。所以我发现了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 &amp; 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。

【问题讨论】:

  • 显示的不是A、B、C的值。输入A你就会得到你想要的
  • 如果我输入 A,它会打印出矩阵 A,只有在第一步中分配的零。
  • 我没有这个,这个作业对我很有效。你的包/R 版本是最新的吗?
  • 我使用的是 R 版本 3.2 和 foreach 1.4.2。我没有看到 foreach 将数据写入矩阵。
  • 这不是foreach 循环的工作方式。你应该研究这些小插曲。简而言之,返回每次迭代的结果(就像使用函数一样)并使用传递给 .combine 的函数或在后续步骤中组合结果。

标签: r foreach parallel-processing parallel-foreach


【解决方案1】:

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

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-03-12
    • 2012-12-09
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多