r - R中的嵌套foreach循环以更新公共(public)数组

标签 r foreach parallel-processing

我正在尝试在 R 中使用几个 foreach 循环来并行填充一个公共(public)数组。我正在尝试做的一个非常简化的版本是:

library(foreach)
set.seed(123)
x <- matrix(NA, nrow = 8, ncol = 2)

foreach(i=1:8) %dopar% {
    foreach(j=1:2) %do% {

      l <- runif(1, i, 100)
      x[i,j] <- i + j + l     #This is much more complicated in my real code.   

    }
}

我想编写代码来更新矩阵 x并行并且输出如下所示:
> x
       [,1]      [,2]
 [1,]  31.47017  82.04221
 [2,]  45.07974  92.53571
 [3,]  98.22533  12.41898
 [4,]  59.69813  95.67223
 [5,]  63.38633  55.37840
 [6,] 102.94233  56.61341
 [7,]  78.01407  69.25491
 [8,]  26.46907 100.78390 

但是,我似乎无法弄清楚如何更新数组。我试过把 x <-其他地方,但它似乎不喜欢它。我认为这将是一件很容易解决的事情,但我所有的搜索还没有把我带到那里。谢谢。

最佳答案

foreach循环用于它们的返回值,如 lapply .通过这种方式,它们与 for 非常不同。用于其副作用的循环。通过使用适当的 .combine函数,内部foreach循环可以返回由外部 foreach 按行组合成矩阵的向量环形:

x <- foreach(i=1:8, .combine='rbind') %dopar% {
   foreach(j=1:2, .combine='c') %do% {
     l <- runif(1, i, 100)
     i + j + l  
   }
}

您也可以使用嵌套运算符:%:% :
x <- foreach(i=1:8, .combine='rbind') %:%
   foreach(j=1:2, .combine='c') %dopar% {
     l <- runif(1, i, 100)
     i + j + l  
   }

请注意 set.seed可能不会做你想做的事,因为它是在本地机器上执行的,而随机数是在不同的 R session 中生成的,可能在不同的机器上。

关于r - R中的嵌套foreach循环以更新公共(public)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17508238/

相关文章:

r - 如何向回归表添加其他 GOF(例如 ivreg 诊断)?

R : help to analyse cluster content in hierarchical clustering

php - 更新或插入mysql中每个用户的信息

java - 带有 Consumer 或 Filter 的 Java8 List 的条件,哪种方式更好

R:拆分此样本的更好方法

c# - 使用 LINQ 扩展将对象添加到嵌套在字典中的列表

multithreading - 蚁群优化中的数据并行

matlab - 在 MATLAB 中使用 parfor 时避免竞争条件

python - 在 TensorFlow 中使用多个 CPU 内核

R data.table - 字符串的快速比较