【发布时间】:2020-07-08 01:25:29
【问题描述】:
我正在尝试从我的目录中生成由其他堆叠光栅图像组成的单个光栅图像:
ncfiles <- list.files("~/Desktop/Summer 2020/Tropomi/Aerosol Height", full.names = T, pattern = "*.nc")
当我关注这个example 并运行这个循环时:
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)
我的循环不断重复运行。是什么导致我的循环无休止地运行?以及如何生成所需的堆叠光栅图像?感谢您的任何意见!
【问题讨论】:
-
造成问题的一个原因可能是您在
test函数中运行了一个 for 循环。lapply已经将test应用于ncfiles中的所有文件,因此无需在test本身内循环。尝试删除for语句,并将ncfiles[i]替换为file(test函数的参数) -
你打算用
inherits(errorCondition(...))做什么?首先,inherits接受 两个 参数,x=(对象)和what=(1 个或多个字符串,指示与对象类进行比较的类);你错过了what。其次,errorCondition的设计目的是始终将某些东西放在类"error"之外,这就是它的功能,因此直接将其与inherits一起使用对我来说毫无意义,即使您确实为inherits提供了第二个参数。第三,next是一个保留字,旨在用于某些循环(例如,for、while),而不是作为函数的参数。 -
如果您的所有栅格都在同一范围内并且 ncfiles 是您的栅格文件列表,您可以通过
do.call(raster::stack, lapply(raster::raster, ncfiles))读取。
标签: r for-loop geospatial lapply raster