4

我正在寻找一种有效的解决方案来(递归地)将嵌套列表(任意深度)展平为非嵌套的 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

我希望元素以 as或 asNULL出现在输出中。还有双循环,然后让事情变得有点慢。这个函数在我的代码中被广泛使用。有没有办法一次性完成所有操作?NULLNAenquoteeval

4

1 回答 1

5

rapply用您自己的递归替换该部分,因此NULLs 不会得到任何特殊处理:

renquote <- function(l) if (is.list(l)) lapply(l, renquote) else enquote(l)

lapply(unlist(renquote(ml)), eval)
于 2013-11-01T23:36:02.573 回答