r - 使 .combine 函数可扩展

标签 r foreach domc

我正在尝试使用 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 次迭代?

最佳答案

您的.combine函数必须采用两部分并返回“看起来”像一 block 的东西(可以作为一部分传回),或者采用许多参数并将它们一次性放在一起(具有相同的限制)。因此至少你的 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)

这个版本一次只需要两 block 。

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)

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

关于r - 使 .combine 函数可扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7561963/

相关文章:

r - 如何删除数据表列中的填充

powershell - 为什么我的 foreach 变量在每次迭代后没有进入 PowerShell 中的输出?

perl foreach 循环与函数关闭规则

r - 在 R 中使用多核和 doMC 时如何标记我的子进程以进行日志记录

R 检查重复项非常慢,即使使用 mclapply

r - 将 NA 值添加到 ggplot 图例以获得连续数据图

r - R 中的每小时时间序列。 ts(... start) 是如何工作的?

R/openxlsx/查找Excel文件中的第一个非空单元格

php - foreach 中的 while 循环导致空白页

R 多核 mcfork() : Unable to fork: Cannot allocate memory