如何在R中自动创建列表列表

时间:2012-07-27 09:37:28

标签: r

我可以手工制作这个清单:

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()电话中的参数名称,这让我感到困扰。所以,当它困扰我时,我将使用塞巴斯蒂安答案中所示的alply电话。

1 个答案:

答案 0 :(得分: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)