use*_*782 7 parallel-processing foreach r
我想知道在使用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
}
Run Code Online (Sandbox Code Playgroud)
我想要的输出是长度为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
Run Code Online (Sandbox Code Playgroud)
我从前一篇文章中尝试了这个保存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)
}
Run Code Online (Sandbox Code Playgroud)
但它没有给出预期的结果
当我执行以下操作时:
result <- foreach(i=1:100, .comb=cbind) %dopar% {
#### some code here
#### some code here
vec1 <- result_from_previous code
vec2 <- result_from_previous code
}
Run Code Online (Sandbox Code Playgroud)
我只获得了data.frame vec2.有没有办法返回或保存两个输出?
谢谢
Ste*_*ton 12
如果需要从foreach循环的主体返回两个对象,则必须以某种方式将它们捆绑到一个对象中,并且列表是最常用的方法.诀窍是提供适当的组合功能以实现所需的最终结果.如果您想要将所有vec1对象与cbind所有vec2对象组合在一起cbind,那么该mapply函数非常方便.我想这就是你想要的:
comb <- function(...) {
mapply('cbind', ..., SIMPLIFY=FALSE)
}
Run Code Online (Sandbox Code Playgroud)
这是这个组合功能的一个小测试程序:
result <- foreach(i=1:100, .combine='comb', .multicombine=TRUE) %dopar% {
vec1 <- rep(i, 10)
vec2 <- rep(2*i, 10)
list(vec1, vec2)
}
Run Code Online (Sandbox Code Playgroud)
这将返回包含两个10 X 100矩阵的列表,但是如果是数据帧vec1,vec2则可以使用相同的组合函数.