【发布时间】:2014-11-16 00:12:51
【问题描述】:
list(list(NULL,NULL),list(NULL,NULL))
结果是:
[[1]]
[[1]][[1]]
NULL
[[1]][[2]]
NULL
[[2]]
[[2]][[1]]
NULL
[[2]][[2]]
NULL
假设我想对大于 2 的数字执行此操作,有没有办法通过复制获得相同的列表结构?
【问题讨论】:
list(list(NULL,NULL),list(NULL,NULL))
结果是:
[[1]]
[[1]][[1]]
NULL
[[1]][[2]]
NULL
[[2]]
[[2]][[1]]
NULL
[[2]][[2]]
NULL
假设我想对大于 2 的数字执行此操作,有没有办法通过复制获得相同的列表结构?
【问题讨论】:
使用replicate
replicate(n=3, {replicate(n=3,NULL,simplify=FALSE)},simplify=FALSE)
[[1]]
[[1]][[1]]
NULL
[[1]][[2]]
NULL
[[1]][[3]]
NULL
[[2]]
[[2]][[1]]
NULL
[[2]][[2]]
NULL
[[2]][[3]]
NULL
[[3]]
[[3]][[1]]
NULL
[[3]][[2]]
NULL
[[3]][[3]]
NULL
或者更简单(感谢@RichardScriven)
replicate(3, list(replicate(3, list(NULL))))
【讨论】:
也许写一个小函数,这样你就可以调整每个列表的复制和长度,并且还可以选择返回一个数组或一个列表。
nest <- function(len = 1L, n = 1L, ...) {
replicate(n, vector("list", len), ...)
}
nest()
nest(2)
nest(2, simplify = FALSE)
nest(3, 2, simplify = FALSE)
【讨论】:
您可以使用rep 用更少的字母来做到这一点:
rep(list(rep(list(NULL), 3)), 3)
[[1]]
[[1]][[1]]
NULL
[[1]][[2]]
NULL
[[1]][[3]]
NULL
[[2]]
[[2]][[1]]
NULL
[[2]][[2]]
NULL
[[2]][[3]]
NULL
[[3]]
[[3]][[1]]
NULL
[[3]][[2]]
NULL
[[3]][[3]]
NULL
【讨论】: