【问题标题】:Foreach combine output - specific vectorsForeach 结合输出 - 特定向量
【发布时间】:2018-03-03 08:48:16
【问题描述】:

我刚刚开始使用foreachparallel,在合并每次迭代的输出时遇到了一些挑战。

目前,在每次迭代中,我都会输出一组变量,我想将它们组合成一个向量,这样我就可以获得所有迭代的一些汇总统计信息。 一个例子:

foreach (s = 1:num) %dopar%{
var1 = ...
var2 = ...
var3 = ...}

最终我想要 3 个向量,其中包含每次迭代产生的输出,所以: var1 = c(var1 来自 s=1, var1 来自 s=2, var1 来自 s=3, ...)

我查看了 .combine 选项并尝试创建一个可以追加的函数,但没有成功。

【问题讨论】:

标签: r foreach parallel-processing


【解决方案1】:

foreach...%dopar% 之后的{} 的行为类似于函数,即无论您是否明确指定,它都会返回一个值。它通常不指定,但通过指定你可以返回任何你喜欢的值

foreach(I=1:3) %dopar% { <complicated stuff> 
                         return(1) }

# [[1]]
# [1] 1

# [[2]]
# [1] 1

# [[3]]
# [1] 1

在你的情况下,你想返回 3 个向量,不幸的是这是不可能的

library(foreach)
library(doParallel)
cl <- makeCluster(detectCores())
registerDoParallel(cl)

foreach(I=1:8) %dopar% { v1 <- "ant"
                 v2 <- "pant"
                 return(v1, v2) }

这会导致以下错误

Error in { : task 1 failed - "multi-argument returns are not permitted"

但是你可以列出你的向量,然后返回值

foreach(I=1:8, .combine=rbind) %dopar% {  v1 <- "ant"
                                          v2 <- "pant"
                                          return(list(v1, v2)) }

         # [,1]  [,2]  
# result.1 "ant" "pant"
# result.2 "ant" "pant"
# result.3 "ant" "pant"
# result.4 "ant" "pant"
# result.5 "ant" "pant"
# result.6 "ant" "pant"
# result.7 "ant" "pant"
# result.8 "ant" "pant"

stopCluster(cl)

【讨论】:

  • 谢谢!我更喜欢不依赖另一个包的解决方案,这个答案符合要求。
  • 跟进此解决方案 - 我将如何访问结果列表?从堆叠列表中,我想通过子集到堆叠列表的第一列来重新创建 v1。
  • 编辑:我能够通过将整个 foreach 分配给一个变量来进行子集化。感谢您的帮助!
【解决方案2】:

使用future 的解决方案:
doFuturefutureforeach 包装器,我更喜欢它而不是parallel
这里我们创建data.frameres,你可以使用res$vector1访问向量

library(doFuture)
registerDoFuture()
plan(multiprocess)

Nlength <- 1000
Nvector <- 3

res <- foreach(i = 1:Nvector, .combine = cbind) %dopar% {
    1:Nlength / pi * rnorm(1)
}
res <- data.frame(res)
colnames(res) <- paste0("vector", 1:Nvector)

dim(res)
[1] 1000    3

【讨论】:

  • 谢谢!我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2017-10-05
  • 2018-05-19
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多