Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使.combine函数可伸缩_R_Foreach_Domc - Fatal编程技术网

R 使.combine函数可伸缩

R 使.combine函数可伸缩,r,foreach,domc,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)) } 但不是这个: x = foreach(i=1:3,.combine=MyComb)

我正在尝试使用foreach,但在使.combine函数可扩展时遇到问题。例如,这里有一个简单的组合函数

MyComb <- function(part1,part2){
          xs <- c(part1$x,part2$x)
          ys <- c(part1$y,part2$y)
          return(list(xs,ys))
          }
但不是这个:

 x = foreach(i=1:3,.combine=MyComb) %dopar% list("x"=i*2,"y"=i*3)

有没有一种方法可以将combine函数推广到n次迭代

您的
.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)

MyComb1谢谢!所以在我的实际应用程序中,提供给MyComb的每个位都是一个列表,其中包含一组元素,每个元素都是矩阵从原始列表中删除每个同名矩阵,并最终返回一个包含这些数组的大列表。我很难看到如何使用MyComb2解决方案实现这一点。有什么想法吗?@scottyaz可能只是将
unlist(…)
替换为
abind(…,along=3)
,但是没有建立一个工作示例,我不确定。
sapply(dots,[[],e)
的结果是一个每个部分都有一个名为“e”的组件列表。
abind
可以将一个列表作为其参数,因此它应该使用从
sapply
返回的内容。
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)