2

このリストを手動で作成できます。

list( list(n=1) , list(n=2), list(n=3) )

しかし、たとえば、n を 10 まで上げたい場合、これを自動化するにはどうすればよいでしょうか。as.list(1:10) を試してみましたが、これはまずデータ構造の型が異なり、次に n の指定方法がわかりませんでした。

答えが複数の要素リストに拡張できることを願っています。たとえば、1:3 と c('A','B') のすべての組み合わせです。

list( list(n=1,z='A') , list(n=2,z='A'), list(n=3,z='A'),
      list(n=1,z='B') , list(n=2,z='B'), list(n=3,z='B') )

背景: 次のように使用します。lapply( outer_list, function(params) do.call(FUN,params) )

更新: どの回答にチェックマークを付けるかを選択するのは困難でした。expand.grid2つ以上のパラメーターに簡単にスケーリングできるため、このアプローチを採用しました。mapplyコメントに示されているように を使用すると、上記の 2 つの例が適度にコンパクトで読みやすくなります。

outer_list=with( expand.grid(n=1:10,stringsAsFactors=F),
    mapply(list, n=n, SIMPLIFY=F)
    )

outer_list=with( expand.grid(n=1:3,z=c('A','Z'), stringsAsFactors=F),
    mapply(list, n=n, z=z, SIMPLIFY=F)
    )

呼び出しでパラメーター名を繰り返すことにより、DRY の原則に違反しているmapply()ため、少し気になります。ですから、気になるときはalply、セバスチャンの回答に示されているように呼び出しを使用します。

4

2 に答える 2

4

expand.grid を使用して拡張する必要はありません。

L <- mapply(function(x, y) list("n"=x,"z"=y),
            rep(1:10, each=10), LETTERS[1:10],
            SIMPLIFY=FALSE)

編集(以下のコメントを参照)

L <- mapply(function(x, y) list("n"=x,"z"=y),
            rep(1:10, each=length(LETTERS[1:10])), LETTERS[1:10],
            SIMPLIFY=FALSE)
于 2012-07-27T09:56:39.197 に答える
3
vals <- expand.grid(n=1:3, z=c("A", "B"), 
                      KEEP.OUT.ATTRS=FALSE, stringsAsFactors=FALSE)

library(plyr)
alply(vals, 1, as.list)

$`1`
$`1`$n
[1] 1

$`1`$z
[1] "A"


$`2`
$`2`$n
[1] 2

$`2`$z
[1] "A"


$`3`
$`3`$n
[1] 3

$`3`$z
[1] "A"


$`4`
$`4`$n
[1] 1

$`4`$z
[1] "B"


$`5`
$`5`$n
[1] 2

$`5`$z
[1] "B"


$`6`
$`6`$n
[1] 3

$`6`$z
[1] "B"


attr(,"split_type")
[1] "array"
attr(,"split_labels")
  n z
1 1 A
2 2 A
3 3 A
4 1 B
5 2 B
6 3 B
于 2012-07-27T09:48:18.407 に答える