Как перебрать список, сохранив формат результатов?
У меня есть простая функция для создания списка растровых файлов из списка с их именами (в формате.grd и с именем list_names в примере ниже):
ListRasters <- function(list_names) {
raster_list <- list() # initialise the list of rasters
for (i in 1:(length(list_names))){
grd_name <- list_names[i] # list_names contains all the names of the images in .grd format
raster_file <- raster(grd_name)
}
raster_list <- append(raster_list, raster_file) # update raster_list at each iteration
}
# Apply the function
raster_list <-lapply(list_names, FUN = ListRasters)
Желаемый результат должен быть в формате:
[[1]]
class : RasterLayer
# etc
[[2]]
class : RasterLayer
# etc
Но вместо этого я получаю их в формате:
[[1]]
[[1]][[1]]
class : RasterLayer
# etc
[[2]]
[[2]][[1]]
class : RasterLayer
# etc
Это проблема, потому что позже я не могу получить доступ к элементам в списке растров. Я не могу найти решение, потому что я не понимаю, почему итерация дает такой формат результата. Можете ли вы дать мне какое-то объяснение или совет о том, как исправить функцию, или вы можете увидеть, где я делаю ошибку?
Любая помощь приветствуется!
Спасибо!!
1 ответ
Кажется, что-то странное с вашей петлей. Тем не менее, lapply
собирается вернуть список, может быть, вы должны попробовать sapply
,
raster_list <-sapply(list_names, FUN = ListRasters)
Я думаю, что это должно дать вам то, что вы хотите.
РЕДАКТИРОВАТЬ:
Было бы лучше, если бы вы привели минимальный воспроизводимый пример, потому что мы не знаем, как данные и каковы raster
функция, но ниже следует игрушечный пример с различиями lapply
а также sapply
,
PS: и кажется, что ваша итерация формулы не верна, но вам нужно будет предоставить больше информации, чтобы мы могли исправить формулу.
list_names <- c("a", "b","c", "d") #defining the list_names
#defining the function
ListRasters <- function(list_names) {
raster_list <- list() # initialise the list of rasters
for (i in 1:(length(list_names))){
grd_name <- list_names[i] # list_names contains all the names of the images in .grd format
raster_file <- paste("file", grd_name, sep=".")
}
raster_list <- append(raster_list, raster_file) # update raster_list at each iteration
}
С помощью lapply
:
raster_list <-lapply(list_names, FUN = ListRasters)
Выход:
[[1]]
[[1]][[1]]
[1] "file.a"
[[2]]
[[2]][[1]]
[1] "file.b"
[[3]]
[[3]][[1]]
[1] "file.c"
[[4]]
[[4]][[1]]
[1] "file.d"
С помощью sapply
:
raster_list <-sapply(list_names, FUN = ListRasters)
Выход:
$a
[1] "file.a"
$b
[1] "file.b"
$c
[1] "file.c"
$d
[1] "file.d"