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)

結合関数を一般化して n 回の繰り返しに拡張できるようにする方法はありますか?

4

1 に答える 1

3

関数.combineは、2 つのピースを取り、ピースのように「見える」ものを返す (一部として戻すことができる) か、多くの引数を取り、それらすべてを一度にまとめる (同じ制限付き) 必要があります。したがって、少なくともコンポーネントを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)

このバージョンは、一度に 2 個しか取りません。

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 に答える