Ясно, что дело в рекурсивной функции, но получить возвращаемые значения для правильного удаления сложно Вот функция, которая сделает это; имена не совсем правильные, но потом это легко исправить.
unnest <- function(x) {
if(is.null(names(x))) {
list(unname(unlist(x)))
}
else {
c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest)))
}
}
Выход unnest(l)
равен
$all
[1] 1 2 3 4 5 6 7 8 9 10
$A.all
[1] 1 2
$A.a
[1] 1
$A.b
[1] 2
$B.all
[1] 3 4 5 6 7 8 9 10
$B.cd.all
[1] 3 4 5 6 7 8
$B.cd.c
[1] 3 4 5
$B.cd.d
[1] 6 7 8
$B.e
[1] 9 10
и может быть преобразован в желаемый результат с помощью
out <- unnest(l)
names(out) <- sub("\\.*all", "", names(out))
out[-1]
Чтобы не повторяться, когда есть только один элемент, попробуйте
unnest2 <- function(x) {
if(is.null(names(x)) | length(x)==1) {
list(unname(unlist(x)))
} else {
c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest2)))
}
}