我正在寻找一种有效的解决方案(递归地)将嵌套列表(任意深度)展平为非嵌套的1深度列表。列表元素不是同类的,因此它们不应该被列入向量中(将所有值强制转换为单个类型)。到目前为止,最好的解决方案是:
flatlist <- function(mylist){
lapply(rapply(mylist, enquote, how="unlist"), eval)
}
这几乎符合我的要求:
> flatlist(list(foo=TRUE, bar=456, pets=list(cat="meeuw", dog="woof")))
$foo
[1] TRUE
$bar
[1] 456
$pets.cat
[1] "meeuw"
$pets.dog
[1] "woof"
然而,问题是rapply
正在丢弃NULL
值,这是不受欢迎的:
> flatlist(list(foo=123, bar=NULL))
$foo
[1] 123
我希望NULL
元素出现在输出中,可以是NULL
,也可以是NA
。另外,使用enquote
然后eval
的双循环会使事情变得有点慢。此函数在我的代码中广泛使用。有没有办法在一次运行中完成所有操作?
答案 0 :(得分:5)
将rapply
部分替换为您自己的递归,以便NULL
没有得到任何特殊处理:
renquote <- function(l) if (is.list(l)) lapply(l, renquote) else enquote(l)
lapply(unlist(renquote(ml)), eval)