我想知道是否/如何可以返回多个输出作为foreach dopar
loop.
让我们举一个非常简单的例子。假设我想做 2 项操作作为foreach
循环,并希望返回或保存每个值的两个操作的结果i
.
如果只返回一个输出,则很简单:
library(foreach)
library(doParallel)
cl <- makeCluster(3)
registerDoParallel(cl)
oper1 <- foreach(i=1:100000) %dopar% {
i+2
}
oper1
将是一个包含 100000 个元素的列表,每个元素都是操作的结果i+2
对于 i 的每个值。
假设现在我想分别返回或保存两个不同操作的结果,例如i+2
and i+3
。我尝试了以下方法:
oper1 = list()
oper2 <- foreach(i=1:100000) %dopar% {
oper1[[i]] = i+2
return(i+3)
}
希望结果i+2
将被保存在列表中oper1
,第二次运算的结果i+3
将被返回foreach
。但是,列表中没有填充任何内容oper1
!在这种情况下,只有结果i+3
从循环中返回。
有没有办法将两个输出返回或保存在两个单独的列表中?
不要尝试对 foreach 或任何其他并行程序包使用副作用。相反,返回列表中 foreach 循环体的所有值。如果您希望最终结果是两个列表的列表而不是 100,000 个列表的列表,请指定一个转置结果的组合函数:
comb <- function(x, ...) {
lapply(seq_along(x),
function(i) c(x[[i]], lapply(list(...), function(y) y[[i]])))
}
oper <- foreach(i=1:10, .combine='comb', .multicombine=TRUE,
.init=list(list(), list())) %dopar% {
list(i+2, i+3)
}
oper1 <- oper[[1]]
oper2 <- oper[[2]]
请注意,此组合功能需要使用.init
设置值的参数x
第一次调用组合函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)