【问题标题】:outptut two objects using foreach使用 foreach 输出两个对象
【发布时间】:2015-04-05 14:10:28
【问题描述】:

我想知道使用foreach%dopar%循环后是否可以输出两个不同的对象。

我将尝试解释我在寻找什么。假设由于循环内的几个操作,我有两个 data.frame:

library(doMC)
library(parallel)
registerDoMC(cores=4)

result <- foreach(i=1:100) %dopar% {
#### some code here
#### some code here
vec1 <- result_from_previous code # It would be the 1st object I'd like to ouput
vec2 <- result_from_previous code # It would be the 2nd object I'd like to output
}

我想要的输出是长度为 2 的 data.frames 列表,例如:

dim(result[[1]]) # equals to nrow=length(vec1) and ncol=100
dim(result[[2]]) # equals to nrow=length(vec2) and ncol=100

我在之前的帖子Saving multiple outputs of foreach dopar loop中尝试过这个:

comb <- function(x, ...) {
  lapply(seq_along(x), function(i) c(x[[i]], lapply(list(...), function(y) y[[i]])))

result <- foreach(i=1:100, .comb='comb', .multicombine=TRUE) %dopar% {
#### some code here
#### some code here
vec1 <- result_from_previous code 
vec2 <- result_from_previous code 
list(vec1, vec2)
}

但它没有给出预期的结果

当我执行以下操作时:

result <- foreach(i=1:100, .comb=cbind) %dopar% {
#### some code here
#### some code here
vec1 <- result_from_previous code 
vec2 <- result_from_previous code 
}

我只获得vec2的data.frame。有没有办法返回或保存两个输出?

谢谢

【问题讨论】:

    标签: r foreach parallel-processing


    【解决方案1】:

    如果您需要从 foreach 循环的主体返回两个对象,则必须以某种方式将它们捆绑到一个对象中,而列表是最常用的方法。诀窍是提供适当的组合功能来实现所需的最终结果。如果您想将所有vec1 对象与cbind 组合,并将所有vec2 对象与cbind 组合,mapply 函数非常方便。我想这就是你想要的:

    comb <- function(...) {
      mapply('cbind', ..., SIMPLIFY=FALSE)
    }
    

    这是这个组合功能的一个小测试程序:

    result <- foreach(i=1:100, .combine='comb', .multicombine=TRUE) %dopar% {
      vec1 <- rep(i, 10)
      vec2 <- rep(2*i, 10)
      list(vec1, vec2)
    }
    

    这将返回一个包含两个 10 X 100 矩阵的列表,但如果 vec1vec2 是数据帧,则可以使用相同的组合函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2020-07-20
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多