在r返回NA时使用foreach循环

时间:2017-08-28 13:08:01

标签: r foreach na doparallel

我想在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”......

2 个答案:

答案 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设置为较高的值。