Ваш вопрос очень неясен, если не сказать больше: пример входных данных, которые у вас есть, и желаемый результат помогут ...
Поскольку вы предлагаете нам «использовать наше воображение», я предполагаю, что у вас есть иерархическая структура данных, то есть список списков ... списков, глубина которых неизвестна. Например,
x <- list(
list(1:3, 4:6),
7:8,
list( list( list(9:11, 12:15), 16:20 ), 21:24 )
)
Листья - это векторы, и вы хотите что-то сделать с этими векторами.
Например, вы можете объединить их в один вектор: это то, что делает функция unlist
.
unlist(x)
Вы также можете захотеть все листья в списке, то есть список векторов.
Вы можете легко написать (рекурсивную) функцию, которая исследует структуру данных и постепенно строит этот список следующим образом.
leaves <- function(u) {
if( is.atomic(u) ) { return( list(u) ) }
result <- list()
for(e in u) {
result <- append( result, leaves(e) )
}
return(result)
}
leaves(x)
Вы также можете захотеть применить функцию ко всем листьям, сохранив при этом структуру данных.
happly <- function(u, f, ...) {
if(is.atomic(u)) { return(f(u,...)) }
result <- lapply(u, function(v) NULL) # List of NULLs, with the same names
for(i in seq_along(u)) {
result[[i]] <- happly( u[[i]], f, ... )
}
return( result )
}
happly(x, range) # Apply the "range" function to all the leaves