我正在寻找一种高效的解决方案,可以将嵌套列表(任意深度)递归地压平为非嵌套、深度为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
的双重循环会导致速度变慢。这个函数在我的代码中广泛使用。有没有一种方法可以一次性完成所有操作?
result <- c(result, .....
。我希望有更本地化的解决方案。 - Jeroen Ooms