我想在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”......
答案 0 :(得分:2)
这是因为"delims was unexpected at this time "
不会更改全局对象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
答案 1 :(得分:0)
foreach
更像lapply
而不是for-loop。
你可以做foreach(i = 1:B, .combine = 'c') %dopar% { i + 1 }
(.multicombine
和.inorder
已经TRUE
,但您可能希望将.maxcombine
设置为较高的值。