我希望使用rep()
将列表扩展到给定长度,如:
n = 5
l = 1:3
rep(l, length=n)
但是,我的列表有两种形式,嵌套或非嵌套:
l1 <- list(a=1, b=2)
l2 <- list(list(a=1, b=2), list(x=1, y=2))
rep(l2, length=n) # as desired
rep(l1, length=n) # result is a single list, where I really want
rep(list(l1), length=n) # instead
要解决此问题,我可能需要将有问题的l1
标识为“第一级”,并在应用list()
之前将其包装到rep()
。这样做的最佳方式是什么?
答案 0 :(得分:2)
这是一个想法:
replist <- function(ls, n){
ls <-
if(sum(sapply(ls, class) != "list") == 0){ # T: all list elements are lists
ls
} else {
list(ls)
}
rep(ls, length = n)
}
identical(replist(l2, 3), rep(l2, length=3)) # TRUE
identical(replist(l1, 3), rep(list(l1), length=3)) # TRUE
答案 1 :(得分:2)
或者,您可以使用is.list():
newlist = function(x,n){
if(is.list(x[[1]])) { rep(x, length=n)
} else { rep(list(x), length=n) }}
identical(newlist(l2,5), rep(l2, length=5))
identical(newlist(l1,5), rep(list(l1), length=5))