在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” ......
答
这是因为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
到高值)。
foreach循环的逆向是针对'i = 1,a = c(2)',但针对'i = 2''是'a = c(NA,3)',因为向量在循环之前被初始化并为每个单一循环清空。在for循环中,第二次调用它不再是空的。因此在'.combine'中将它添加到c(2,NA,3)。 –
感谢您的快速回答!帮助我理解它是如何工作的! – Rhevan