R:列表列表通过cbind而不展平

时间:2011-12-19 04:30:02

标签: list r

假设我们希望将对存储为列表中的元素,例如

> x <- list()
> x[[1]] <- list(1,2)
> x[[2]] <- list(3,4)
> x
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2


[[2]]
[[2]][[1]]
[1] 3

[[2]][[2]]
[1] 4

如果想要使用连接创建相同的东西,而没有明确引用外部列表的索引,那么自然的方法(参见下面的编辑以获得此方法的动机)是

> c(list(list(1,2)),list(3,4))
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2


[[2]]
[1] 3

[[3]]
[1] 4

有没有办法避免将第二个参数“展平”到c(),从而使用连接来生成x

编辑:我本应该清楚我的预期申请。

最后,每当我找到一个循环时,我想在列表中添加对。目前我维护主列表的索引,以便在找到新对时将新对添加到它的末尾,但是使用c可能更自然。因此,使用显式索引,循环可能看起来像这样

index <- 1
l <- list()
for (i in 1:10) {
    for (j in (i+1):10) {
        if ( (i+j)%%2 == 0 ) {
            l[[index]] <- list(i,j)
            index <- index + 1
        }
    }
}

使用c失败的尝试看起来像这样

l <- list()
for (i in 1:10) {
    for (j in (i+1):10) {
        if ( (i+j)%%2 == 0 )
            l <- c(l,list(i,j))
    }
}
答案:如下面的Tommy所述,需要一个额外的列表(),以下工作:

l <- list()
for (i in 1:10) {
    for (j in (i+1):10) {
        if ( (i+j)%%2 == 0 )
            l <- c(l,list(list(i,j)))
    }
}

我应该想到的一些显而易见的事情。汤米还指出,这可能不是一个很好的做事方式。

1 个答案:

答案 0 :(得分:3)

我想简单的答案是“不,你需要额外的list()包装器”。

...但一般情况下,使用索引向预分配列表添加值比使用c()

更好(更快/更少内存)
x <- NULL
for(i in 1:2) x <- c(x, list(list(i,i+1)))
x

x <- vector('list', 2)
for(i in seq_along(x)) x[[i]] <- list(i,i+1)
x

如果可以使用lapply,那通常会更有效:

lapply(1:2, function(i) list(i, i+1))