Как перебрать список, сохранив формат результатов?

У меня есть простая функция для создания списка растровых файлов из списка с их именами (в формате.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"
Другие вопросы по тегам