将嵌套列表展平为1深列表

时间:2013-11-01 19:56:53

标签: r

我正在寻找一种有效的解决方案(递归地)将嵌套列表(任意深度)展平为非嵌套的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的双循环会使事情变得有点慢。此函数在我的代码中广泛使用。有没有办法在一次运行中完成所有操作?

1 个答案:

答案 0 :(得分:5)

rapply部分替换为您自己的递归,以便NULL没有得到任何特殊处理:

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

lapply(unlist(renquote(ml)), eval)