我正在尝试使用foreach并且在使.combine函数可扩展时遇到问题。例如,这是一个简单的组合函数
MyComb <- function(part1,part2){
xs <- c(part1$x,part2$x)
ys <- c(part1$y,part2$y)
return(list(xs,ys))
}
当我使用此函数将foreach语句与2之外的迭代器组合时,它会错误地返回它。例如,这有效:
x = foreach(i=1:2,.combine=MyComb) %dopar% list("x"=i*2,"y"=i*3)
但不是这样:
x = foreach(i=1:3,.combine=MyComb) %dopar% list("x"=i*2,"y"=i*3)
有没有办法推广组合函数,使其可以扩展到n次迭代?
答案 0 :(得分:3)
你的.combine
函数必须采用两个部分并返回“看起来”像一块(可以作为一部分传回)的东西,或者采取许多参数并将它们全部放在一起(使用相同的限制)。因此,至少您的MyComb
必须返回包含x
和y
组成部分的列表(这是%dopar%
的每一部分。
有两种方法可以做到这一点:
MyComb1 <- function(part1, part2) {
list(x=c(part1$x, part2$x), y=c(part1$y, part2$y))
}
x = foreach(i=1:3,.combine=MyComb1) %dopar% list("x"=i*2,"y"=i*3)
此版本一次只需两件。
MyComb2 <- function(...) {
dots = list(...)
ret <- lapply(names(dots[[1]]), function(e) {
unlist(sapply(dots, '[[', e))
})
names(ret) <- names(dots[[1]])
ret
}
s = foreach(i=1:3,.combine=MyComb2) %dopar% list("x"=i*2,"y"=i*3)
x = foreach(i=1:3,.combine=MyComb2, .multicombine=TRUE) %dopar% list("x"=i*2,"y"=i*3)
这个可以一次拍多件并组合起来。它更通用(但更复杂)。