在R中嵌套的foreach循环来更新公共数组 [英] nested foreach loops in R to update common array

查看:123
本文介绍了在R中嵌套的foreach循环来更新公共数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

$ p $ library $($)
set.seed(123 )
x < - 矩阵(NA,nrow = 8,ncol = 2)

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

l < - runif(1,i,100)
x [i,j] < - i + j + l#这在我的真实的代码。


$ b $ / code $ / pre

我想要更新代码并行矩阵 x ,输出如下所示:

 > ; x 
[,1] [,2]
[1,] 31.47017 82.04221
[2,] 45.07974 92.53571
[3,] 98.22533 12.41898
[ ] 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 。通过这种方式,它们与用于副作用的循环非常不同。通过使用适当的 .combine 函数,内部的 foreach 循环可以返回向量组合的行,由外部 foreach 循环:

  x < -  foreach(i = 1:8,.combine ='rbind')%dopar%{
foreach(j = 1:2,.combine ='c')%do%{
l < - runif 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会话中产生的,可能在不同的机器上。

I am trying to use a couple of foreach loops in R to fill out a common array in parallel. A very simplified version of what I am trying to do is:

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.   

    }
}

I would like to code to update the matrix x in parallel and have the output look like:

> 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 

However, I cannot seem to figure out how to get the array to be updated. I have tried putting the x <- elsewhere, but it doesn't seem to like it. I think this will be a very easy thing to fix, but all my searching has not lead me there yet. Thanks.

解决方案

foreach loops are used for their return value, like lapply. In this way they are very different from for loops which are used for their side effects. By using the appropriate .combine functions, the inner foreach loop can return vectors which are combined row-wise into a matrix by the outer foreach loop:

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

You can also use the nesting operator: %:%:

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

Note that set.seed probably won't do what you want, since it is being performed on the local machine, while the random numbers are generated in different R sessions, possibly on different machines.

这篇关于在R中嵌套的foreach循环来更新公共数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆