4

ネストされたリスト (任意の深さ) をネストされていない 1 つの深いリストに (再帰的に) 平坦化するための効率的なソリューションを探しています。リストの要素は同種ではないため、ベクトルにリストから外すことはできません (すべての値を 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要素が asNULLまたは asとして出力に表示されることを望みNAます。enquoteまた、 and thenを使用した二重ループによりeval、処理が少し遅くなります。この関数は、私のコードで広く使用されています。1回の実行ですべてを実行する方法はありますか?

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 に答える