假设我们希望将对存储为列表中的元素,例如
> 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)))
}
}
我应该想到的一些显而易见的事情。汤米还指出,这可能不是一个很好的做事方式。
答案 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))