在 r 中使用 foreach 循环返回 NA
Posted
技术标签:
【中文标题】在 r 中使用 foreach 循环返回 NA【英文标题】:Using foreach loop in r returning NA 【发布时间】:2018-02-05 18:34:13 【问题描述】:我想在 R 中使用“foreach”循环(包 foreach + doParallel),但在我的工作中我发现循环返回一些 NA,而经典的“for”循环返回我想要的值:
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
如你所见,如果你尝试一下,对象“a”返回一个带有 2、NA 和 3 的向量,而对象“b”返回 2 和 3(这就是我想要的)。
我实际上不明白为什么我的结果中有一个“NA”...
【问题讨论】:
foreach 循环的重新运行是针对i = 1, a = c(2)
但对于i = 2
它是a = c(NA, 3)
,因为向量在循环之前被初始化并且对于每个单循环都是空的。在 for 循环中,第二次调用它时不再为空。因此在.combine
它被添加到c(2, NA, 3)。
感谢您的快速回答!帮助我了解它是如何工作的!
【参考方案1】:
foreach
的工作方式更像 lapply
,而不是 for 循环。
你可以简单地做foreach(i = 1:B, .combine = 'c') %dopar% i + 1
(.multicombine
和 .inorder
已经是 TRUE
,但您可能希望将 .maxcombine
设置为较高的值)。
【讨论】:
【参考方案2】:这是因为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
【讨论】:
非常感谢!现在我更好地理解了“foreach”循环是如何工作的,并且我将在我更复杂的工作中使用它(这只是为了尝试了解正在发生的事情)。以上是关于在 r 中使用 foreach 循环返回 NA的主要内容,如果未能解决你的问题,请参考以下文章
在 foreach 循环中使用 mclapply 出现 R 错误
在 R 中使用 foreach 循环读取 MATLAB .mat 文件时出现问题
如何在 R 中嵌套 foreach 循环的内循环和外循环之间添加代码