使用 foreach 输出两个对象
outptut two objects using foreach
我想知道在使用 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
我在之前的 post 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。有没有办法返回或保存两个输出?
谢谢
如果您需要 return 来自 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)
}
这将 return 包含两个 10 X 100 矩阵的列表,但如果 vec1
和 vec2
是数据帧,则可以使用相同的组合函数。
我想知道在使用 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
我在之前的 post 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。有没有办法返回或保存两个输出?
谢谢
如果您需要 return 来自 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)
}
这将 return 包含两个 10 X 100 矩阵的列表,但如果 vec1
和 vec2
是数据帧,则可以使用相同的组合函数。