首页 > 解决方案 > lapply 在尝试堆叠栅格时创建无限循环

问题描述

我正在尝试从我的目录中生成由其他堆叠光栅图像组成的单个光栅图像:

ncfiles <- list.files("~/Desktop/Summer 2020/Tropomi/Aerosol Height", full.names = T, pattern = "*.nc")

当我按照这个例子运行这个循环时:

bigstack <- stack()

test <- function(file) { for (i in 1: length(ncfiles)){
  GetMyImage <- tryCatch(        
    {
      fname <-(ncfiles[i])
      f <- nc_open(fname)
      print(fname)
    },
    error=function(e) {
      message('Caught Error')
      print(e)
    },
    warning=function(w) {
      message('Caught Warning')
      print(w)
    },
    finally = {
      message('All done')
    }
  )
  if(inherits(errorCondition("ERROR :", next)))
  {
    varx <- attributes(f$var) $names
    vary <- ncvar_get(f, varx)
    rm(f)
    proj <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
    rbrick <- brick(vary, crs=proj)
    rm(vary)
    extent(rbrick) <- c(-180, -140, 10, 30)
    return(rbrick)
  }}}

然后尝试堆叠:

allyrs <- lapply(ncfiles, test)

我的循环不断重复运行。是什么导致我的循环无休止地运行?以及如何生成所需的堆叠光栅图像?感谢您的任何意见!

标签: rfor-loopgeospatiallapplyraster

解决方案


我建议让事情更加模块化。首先是您想要一个文件的功能

open_one_file <- function(fname) {
    f <- nc_open(fname)
    varx <- attributes(f$var) $names
    vary <- ncvar_get(f, varx)
    proj <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
    rbrick <- brick(vary, crs=proj)
    extent(rbrick) <- c(-180, -140, 10, 30)
    return(rbrick)
}

现在获取文件名

ncfiles <- list.files(full.names = T, pattern = "\\.nc$")

用几个文件测试这个功能。例如

test <- open_one_file(ncfiles[3])

如果这适用于某些文件,请使用循环或lapply全部读取它们。显然有些失败,所以我添加了一个try子句。

x <- lapply(ncfiles, function(i) try(open_one_file(i))) 

如果您有失败的文件,则使用循环可能更容易

x <- list()
for (i in 1:length(ncfiles)) {
    print(i); print(ncfiles[i]); flush.console()
    x[[i]] <- open_one_file(ncfiles[i]) 
 }

x您可以像这样在列表中组合 RasterBricks

y <- stack(x)

正如@at80 指出的那样,使用标准 ncdf 文件,您更愿意这样做

x <- lapply(ncfiles, brick)

或者

x <- lapply(ncfiles, function(f) brick(f, var="variable names"))

其次是

y <- stack(x)

推荐阅读