【问题标题】:R foreach %dopar% : export results to main R processR foreach %dopar% :将结果导出到主 R 进程
【发布时间】:2013-09-13 09:52:25
【问题描述】:

%dopar% 将主 R 进程分成几个独立的子进程。有没有办法让这些子进程与主 R 进程通信,从而可以“恢复”数据?

require(foreach) 
require(doMC) 
registerDoMC() 
options(cores = 2 )

a <- c(0,0)
foreach(i = 1:2 ) %do% {
    a[i] <- i
}
print(a) # returns 1 2

a <- c(0,0)
foreach(i = 1:2 ) %dopar% {
    a[i] <- i
}
print(a) # returns 0 0

谢谢!

【问题讨论】:

    标签: r foreach


    【解决方案1】:

    您应该阅读 foreach 文档:

    foreach 和 %do%/%dopar% 运算符提供循环结构 可以看作是标准 for loop 和 lapply 的混合体 功能。它看起来类似于 for 循环,它计算一个 表达式,而不是函数(如 lapply),但它的目的是 返回一个值(默认为列表),而不是导致 副作用。

    Try this:
    a <- foreach(i = 1:2 ) %dopar% {
      i
    }
    print(unlist(a))
    

    【讨论】:

    • 我确实阅读了文档,发现它晦涩难懂...您的回答使这一切变得明朗!非常感谢!
    【解决方案2】:

    如果你希望你的结果是一个数据框,你可以这样做:

     library(data.table)
     result <- foreach(i = 1:2) %dopar% {
          i
     }
     result.df <- rbindlist(Map(as.data.frame, result))
    

    【讨论】:

      【解决方案3】:

      感谢 Karl,我现在明白了 '.combine' 的用途

      a <- foreach(i = 1:2 , .combine=c) %dopar% {
          return(i)
      }
      print(a) # returns 1 2
      

      【讨论】:

      • 不需要return(实际上它有点不起作用)。
      • @konrad-rudolph - 谢谢。
      猜你喜欢
      • 2018-07-13
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多