如何在R中自动生成列表

  • 本文关键字:自动生成 列表 r
  • 更新时间 :
  • 英文 :


我可以手工制作这个列表:

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

但是,我该如何实现自动化,例如,如果我想让n增加到10?我尝试了作为.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()调用中重复参数名称,这让我有点困扰。所以,当它足够困扰我时,我会使用alply调用,如Sebastian的回答所示。

您不需要使用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)
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

最新更新