Oto rekurencyjna realizacja:
flatten2 <- function(X) if(is.list(X)) Reduce(c, lapply(X, flatten2)) else list(X)
Następnie:
str(flatten2(B)) # list of three matrices:
# List of 3
# $ : int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
# $ : int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
# $ : int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
i bardziej złożone:
C <- list(A, list(list(A, A), A))
str(flatten2(C))
# List of 4
# $ : int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
# $ : int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
# $ : int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
# $ : int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
Również "wordier", ale szybsza wersja (ta jest testowana przez P ierre):
flatten <- function(X) {
res <- list()
for(i in X) res <- c(res, if(is.list(i)) Recall(i) else list(i))
res
}
Można też zrobić flatten2
trochę szybciej zastępując Reduce
z do.call
, ale to jest trochę mniej słodkie. flatten
pozostaje najszybszy nawet po tej zmianie.
Twoje rozwiązanie może być najszybsze. –