【问题标题】:Using foreach loop in r returning NA在 r 中使用 foreach 循环返回 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)。
  • 感谢您的快速回答!帮助我了解它是如何工作的!

标签: r foreach na doparallel


【解决方案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”循环是如何工作的,并且我将在我更复杂的工作中使用它(这只是为了尝试了解正在发生的事情)。
    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2019-02-08
    • 2021-08-06
    • 2019-05-08
    • 2019-03-24
    • 1970-01-01
    相关资源
    最近更新 更多