【问题标题】:foreach loop updating matrix after each iteration R每次迭代 R 后的 foreach 循环更新矩阵
【发布时间】:2016-08-02 19:03:40
【问题描述】:

我有一个for 循环,我想并行运行它,所以我使用foreach 来执行此操作。

我的循环的一个输出是一个包含所有迭代结果的矩阵。如果我使用for循环,那么这个矩阵是顺序更新的,最后可以输出。但是,当使用foreach 时,它似乎无法更新此内容。

例如,我整理了一个简单的例子来说明我的观点。

# foreach example - does not update DF matrix.
cl=makeCluster(4)
registerDoParallel(cl)
DF=matrix(NA,ncol=5,nrow=10)
foreach(i=1:10) %dopar% {
  DF[i,1]=i*1
  DF[i,2]=i*2
  DF[i,3]=i*3
  DF[i,4]=i*4
  DF[i,5]=i*5
}

# for loop - Updates DF and produces complete output.
DF=matrix(NA,ncol=5,nrow=10)
for(i in 1:10) {
  DF[i,1]=i*1
  DF[i,2]=i*2
  DF[i,3]=i*3
  DF[i,4]=i*4
  DF[i,5]=i*5
}

我感觉我可能需要在foreach 命令中指定DF 数据框,就像我需要对使用的任何包做的那样,(例如foreach(i=1:10,DF),但我没有成功地完成了这项工作。

【问题讨论】:

    标签: r loops matrix foreach parallel-processing


    【解决方案1】:

    有一个选项可以在 foreach 循环中组合您的结果。你可以用那个。理想情况下,您将需要两个 for 循环来填充矩阵。例如,

    x <- foreach(i=1:10,.combine = rbind) %do% {
        foreach(j=1:10,.combine=c)%do%{
             j
        }
    }
    

    这将创建一个矩阵。希望这有助于得到一个想法

    【讨论】:

    • 这给了我创建矩阵的想法,但是我的原始代码需要输出 3 个数据帧,而不仅仅是一个。因此,我认为这项工作很难/不可能。
    • 在这种情况下,如果您想并行运行,请尝试使用 lapplymclappy 对代码进行矢量化。即使你设法在for 循环中做到这一点,这么长的 for 循环在 R 中也会非常慢。