【问题标题】:How to iterate over a list preserving the format of the results?如何迭代保留结果格式的列表?
【发布时间】:2014-02-12 09:44:23
【问题描述】:

我有一个简单的函数,可以从带有名称的列表中创建光栅文件列表(采用 .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 

这是一个问题,因为后来我无法访问栅格列表中的项目。 我找不到解决方案,因为我不明白为什么迭代会给出这种格式的结果。您能否就如何修复该功能给我一些解释或一些建议,或者您能看出我在哪里犯了错误吗?

非常欢迎任何帮助!

谢谢!!

【问题讨论】:

  • 不需要使用lapply,因为这会给你一个列表列表(在你的情况下)。请改用raster_list &lt;- ListRasters(list_names)。在旁注中,您是否知道您仅在 for-loop 之后附加到列表,而不是在代码注释中描述的每个迭代步骤?
  • raster 函数的输出是什么?

标签: r list format iteration


【解决方案1】:

您的循环似乎有些奇怪。不过,lapply 会返回一个列表,也许你应该试试sapply

raster_list <-sapply(list_names, FUN = ListRasters)

我认为这应该可以满足您的需求。

编辑:

如果你放一个最小可重现的例子会更好,因为我们不知道数据是怎样的,raster 函数是什么,但下面是一个玩具例子,输出的差异是 lapplysapply.

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"

【讨论】:

  • 我认为使用lapplysapply 并不重要。 ListRasters 的结果始终是一个列表,因此无论哪种方式,都会累积列表作为迭代 list_names 的元素的结果。
  • @fotNelton 是的,这很重要,'lapply' 将返回一个列表,'sapply' 将简化输出,我将在上面放一个玩具示例。
  • 感谢您的示例。如果返回的列表始终具有相同的长度,那么您所说的是正确的,这对于原始问题可能是正确的,也可能不是(可能是,但谁知道;-))。所以一个反例是sapply(1:10, function(n) as.list(rep(3,n)))
  • 是的,你是对的。我认为这是因为在那种情况下sapply 无法简化输出。
  • 感谢您的帮助,carloscinelli 和 fotNelton,我现在明白为什么 lapply 无法正常工作了!
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 2022-10-02
相关资源
最近更新 更多