r - 使用 foreach 输出两个对象

标签 r foreach parallel-processing

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

我将尝试解释我在寻找什么。假设我有两个 data.frames 作为循环内的几个操作的结果:

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 .有没有办法返回或保存两个输出?

谢谢

最佳答案

如果您需要从 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 矩阵的列表,但如果 vec1 可以使用相同的组合函数和 vec2是数据框。

关于r - 使用 foreach 输出两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28348749/

相关文章:

Ruby:for 循环和 each 循环有什么区别?

linux - 带组捕获的并行 sed

r - 使用 lapply 更改列表列表

php - 如何从使用 foreach 循环创建的表单中检索 _POST 数据?

r - 基于R中的多个因素确定多个变量的频率

javascript - 使用 Javascript 在 forEach 中进行切换是不好的做法吗?

java - Flink Kafka - 如何使应用程序并行运行?

java 8 reduce with parallelStream 和 stream

如果一个变量是 'too constant',R Mclust(data, G = 1) 会给出奇怪的 Sigma 输出?

r - 如何在句子中添加删除的空格?