Achatar lista aninhada em lista de 1 profundidade

Eu estou procurando uma solução eficiente para (recursivamente) achatar uma lista aninhada (de profundidade arbitrária) em 1 lista profunda não aninhada. Os elementos da lista não são homogêneos, portanto eles não devem ser não listados em um vetor (que coagiria todos os valores para um único tipo). A melhor solução até agora é:

flatlist <- function(mylist){
    lapply(rapply(mylist, enquote, how="unlist"), eval)
}

Isso faz quase o que eu quero:

> 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"

No entanto, um problema é querapply está caindoNULL valores, o que é indesejado:

> flatlist(list(foo=123, bar=NULL))
$foo
[1] 123

Eu gostaria dissoNULL elementos aparecem na saída, comoNULL ou comoNA. Também o laço duplo comenquote e depoiseval torna as coisas um pouco lentas. Essa função é usada extensivamente no meu código. Existe uma maneira de fazer tudo de uma só vez?

questionAnswers(1)

yourAnswerToTheQuestion