2

我正在尝试使用 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)

有没有办法泛化 combine 函数以使其可扩展到 n 次迭代?

4

1 回答 1

3

您的.combine函数必须采用两个部分并返回“看起来”像一个部分的东西(可以作为一部分传回)或采用许多参数并将它们一次放在一起(具有相同的限制)。因此,至少您MyComb必须返回一个包含组件的列表xy(这是您的每一部分%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)

这个可以一次取多件并将它们组合起来。它更通用(但更复杂)。

于 2011-09-26T22:45:43.670 回答