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.grid方法,因为它可以更轻松地扩展到两个以上的参数;注释中显示的使用mapply使上面的两个示例看起来相当紧凑和可读:

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()调用中重复了参数名称,这让我有点困扰。因此,当它让我感到困扰时,我将使用alplySebastian 的回答中所示的调用。

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 回答