Spłaszcz zagnieżdżoną listę na 1-głęboką listę
Szukam skutecznego rozwiązania (rekurencyjnie) spłaszczenia zagnieżdżonej listy (o dowolnej głębi) do nie zagnieżdżonej, głębokiej listy. Elementy listy nie są jednorodne, dlatego nie powinny być umieszczane na liście w wektorze (co wymusiłoby wszystkie wartości do pojedynczego typu). Najlepszym rozwiązaniem do tej pory jest:
flatlist <- function(mylist){
lapply(rapply(mylist, enquote, how="unlist"), eval)
}
To robi prawie to, co chcę:
> 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"
Problemem jest jednak torapply
upadaNULL
wartości, które są niepożądane:
> flatlist(list(foo=123, bar=NULL))
$foo
[1] 123
chciałbymNULL
elementy pojawiają się na wyjściu, jakoNULL
lub jakNA
. Również podwójna pętla zenquote
i wtedyeval
sprawia, że rzeczy są nieco powolne. Ta funkcja jest szeroko używana w moim kodzie. Czy istnieje sposób, aby to zrobić w jednym biegu?