9

との機能 (のようなもの) を組み合わせた (今のところmapply呼び出す)のバリアントを考え出そうとしています。つまり、未知の長さの関数と引数, , , ... のリストの場合、長さのリスト( はlist の長さ) を生成する必要があります。これは、の要素のすべての組み合わせに適用した結果です。リスト。xapplyexpand.gridmapplyFUNL1L2L3n1*n2*n3niiFUN

データフレームではなくリストのリストを生成するように機能した場合expand.grid、それを使用できるかもしれませんが、リストは必ずしもデータフレームにうまく収まらないもののリストである可能性があることを念頭に置いています.

展開するリストがちょうど 3 つある場合、この関数は正常に機能しますが、より一般的な解決策に興味があります。(未使用ですが、単一のリストではなくネストされたリストを生成するFLATTENと想像できます...)FLATTEN=FALSE

xapply3 <- function(FUN,L1,L2,L3,FLATTEN=TRUE,MoreArgs=NULL) {
  retlist <- list()
  count <- 1
  for (i in seq_along(L1)) {
    for (j in seq_along(L2)) {
      for (k in seq_along(L3)) {
        retlist[[count]] <- do.call(FUN,c(list(L1[[i]],L2[[j]],L3[[k]]),MoreArgs))
        count <- count+1
      }
    }
  }
  retlist
}

編集:結果を返すのを忘れました。combnインデックスのリストを作成してそこから移動することで、これを解決できるかもしれません...

4

2 に答える 2

2

私は自分の質問に対する解決策があると思いますが、おそらく誰かがもっとうまくやることができます(そして私は実装していませんFLATTEN=FALSE...)

xapply <- function(FUN,...,FLATTEN=TRUE,MoreArgs=NULL) {
  L <- list(...)
  inds <- do.call(expand.grid,lapply(L,seq_along)) ## Marek's suggestion
  retlist <- list()
  for (i in 1:nrow(inds)) {
    arglist <- mapply(function(x,j) x[[j]],L,as.list(inds[i,]),SIMPLIFY=FALSE)
    if (FLATTEN) {
      retlist[[i]] <- do.call(FUN,c(arglist,MoreArgs))
    }
  }
  retlist
}

編集:@baptisteの提案を試しましたが、簡単ではありませんでした(または私にとってはそうではありませんでした)。私が得た最も近いものは

xapply2 <- function(FUN,...,FLATTEN=TRUE,MoreArgs=NULL) {
  L <- list(...)
  xx <- do.call(expand.grid,L)
  f <- function(...) {
    do.call(FUN,lapply(list(...),"[[",1))
  }
  mlply(xx,f)
}

それでも機能しません。expand.grid確かに思ったよりも柔軟性がありますが(印刷できない奇妙なデータフレームが作成されますが)、内部mlplyで十分な魔法が発生しているため、完全に機能させることはできません。

テストケースは次のとおりです。

L1 <- list(data.frame(x=1:10,y=1:10),
           data.frame(x=runif(10),y=runif(10)),
           data.frame(x=rnorm(10),y=rnorm(10)))

L2 <- list(y~1,y~x,y~poly(x,2))          
z <- xapply(lm,L2,L1)
xapply(lm,L2,L1)
于 2011-06-29T02:36:18.403 に答える