在r返回使用foreach循环不适用

在r返回使用foreach循环不适用

问题描述:

我想在R(包foreach + doParallel)中使用“foreach”循环,但在我的工作中,我发现循环返回一些NA,经典的“for”循环返回值我想:在r返回使用foreach循环不适用

library(foreach) 
    library(doParallel) 

    ncore=as.numeric(Sys.getenv('NUMBER_OF_PROCESSORS'))-1 
    registerDoParallel(cores=ncore) 

    B=2 

    a = vector() 
    b = vector() 

    foreach(i = 1:B, .packages = "ez",.multicombine = T,.inorder = T, .combine = 'c')%dopar%{ 
     a[i] = i + 1 
     return(a) 
    } 

    for(i in 1:B){ 
     b[i] = i + 1 
     b 
     } 

正如你可以看到,如果你试试吧,对象“一”返回一个矢量2,NA和3中,而对象“b”返回2和3(这就是我想要的)。

其实我不明白为什么有我的结果是一个“NA” ......

+1

foreach循环的逆向是针对'i = 1,a = c(2)',但针对'i = 2''是'a = c(NA,3)',因为向量在循环之前被初始化并为每个单一循环清空。在for循环中,第二次调用它不再是空的。因此在'.combine'中将它添加到c(2,NA,3)。 –

+0

感谢您的快速回答!帮助我理解它是如何工作的! – Rhevan

这是因为foreach不会改变全局对象a。尝试结合list。这将会更容易理解正在发生的事情。我已将B增加到3

> B=3 
> 
> a = vector() 
> 
> foreach(i = 1:B, .multicombine = T, .inorder = T, .combine = 'list') %dopar% { 
+ a[i] = i + 1 
+ return(a) 
+ } 
[[1]] 
[1] 2 

[[2]] 
[1] NA 3 

[[3]] 
[1] NA NA 4 

我们可以看到,在每次迭代的空载体a采取和它的一个价值被填满。如果你结合c的结果,你会得到NA的值。

> foreach(i = 1:B, .multicombine = T, .inorder = T, .combine = 'c') %dopar% { 
+ a[i] = i + 1 
+ return(a) 
+ } 
[1] 2 NA 3 NA NA 4 

在这个例子中,你可以做。

> a <- foreach(i = 1:B, .multicombine = T, .inorder = T, .combine = 'c') %dopar% { 
+ i + 1 
+ } 
> a 
[1] 2 3 4 
+0

非常感谢! 现在我更好地理解“foreach”循环是如何工作的,我将在更复杂的工作中使用它(这个只是为了了解发生了什么)。 – Rhevan

foreach更象lapply比一个for循环。

你可以简单地做foreach(i = 1:B, .combine = 'c') %dopar% { i + 1 }.multicombine.inorder已经TRUE,但你可能要设置.maxcombine到高值)。