R lapply在尝试堆叠光栅时会创建无限循环
我正在尝试从我的目录中生成由其他堆叠光栅图像组成的单个光栅图像:R lapply在尝试堆叠光栅时会创建无限循环,r,for-loop,geospatial,lapply,raster,R,For Loop,Geospatial,Lapply,Raster,我正在尝试从我的目录中生成由其他堆叠光栅图像组成的单个光栅图像: ncfiles <- list.files("~/Desktop/Summer 2020/Tropomi/Aerosol Height", full.names = T, pattern = "*.nc") 当我遵循此操作并运行此循环时: bigstack <- stack() test <- function(file) { for (i in 1: length(n
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)
我的循环重复运行,不间断。是什么导致我的循环无休止地运行?如何生成所需的堆叠光栅图像?谢谢你的意见 我建议让事情更加模块化。首先是一个函数,您希望该函数用于一个文件吗
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)
}
如果您有失败的文件,使用循环可能会更容易
x <- list()
for (i in 1:length(ncfiles)) {
print(i); print(ncfiles[i]); flush.console()
x[[i]] <- open_one_file(ncfiles[i])
}
正如@at80所指出的,对于标准ncdf文件,您更愿意这样做
x <- lapply(ncfiles, brick)
或
接着是
y <- stack(x)
我在这里的问题是使循环过于复杂,并且包含与之前在评论中建议的内容相反的组件。我将循环重新格式化为:
ncfiles <- list.files("~/Desktop/Summer 2020/Tropomi/Aerosol Height", full.names = T, pattern = "*.nc")
bigstack <- stack()
for (i in 1: length(ncfiles)){
fname <-(ncfiles[i])
f <- nc_open(fname)
ah <- ncvar_get(f, varid = "DETAILED_RESULTS/aerosol_optical_thickness")
lon <- ncvar_get(nc, varid = "PRODUCT/longitude")
lat <- ncvar_get(nc, varid = "PRODUCT/latitude")
nc_close(f)
s1 <- data.frame(as.vector(lon), as.vector(lat), as.vector(ah))
crsLatLon <- "+proj=longlat +datum=WGS84"
ex <- extent(c(-180,180,-90,90))
pmraster <- raster(ncol=360*10, nrow=180*10, crs=crsLatLon,ext=ex)
pmraster <- rasterize(s1[,1:2], pmraster, s1[,3], fun=mean, na.rm=T)
exHI <- extent(c(-180,-140,10,30))
levelplot(crop(pmraster,exHI))
bigstack <- stack(bigstack, pmraster)
print("test")
}
stacking <- calc(bigstack, fun=mean, na.rm=T)
levelplot(crop(stacking, exHI))
这个问题的一个原因可能是您正在测试函数中运行for循环。Lappy已经将测试应用于ncfiles中的所有文件,所以不需要在测试本身中循环。请尝试删除for语句,并将ncfiles[i]替换为测试函数的file参数。您打算对inheritserrorCondition…执行什么操作。。。?首先,inherits接受两个参数,x=对象,what=1个或多个字符串,表示对象类与之比较的类;你错过了什么。其次,errorCondition设计用于始终将某些内容放入类外错误,这是它的函数,因此直接将其用于inherits对我来说毫无意义,即使您确实为inherits提供了第二个参数。第三,next是一个保留字,用于某些循环中,例如for、while,而不是函数的参数。如果所有光栅都是相同的区段,并且ncfiles是光栅文件的列表,则可以通过do.callraster::stack、lapplyraster::raster、ncfiles读入。
y <- stack(x)
x <- lapply(ncfiles, brick)
x <- lapply(ncfiles, function(f) brick(f, var="variable names"))
y <- stack(x)
ncfiles <- list.files("~/Desktop/Summer 2020/Tropomi/Aerosol Height", full.names = T, pattern = "*.nc")
bigstack <- stack()
for (i in 1: length(ncfiles)){
fname <-(ncfiles[i])
f <- nc_open(fname)
ah <- ncvar_get(f, varid = "DETAILED_RESULTS/aerosol_optical_thickness")
lon <- ncvar_get(nc, varid = "PRODUCT/longitude")
lat <- ncvar_get(nc, varid = "PRODUCT/latitude")
nc_close(f)
s1 <- data.frame(as.vector(lon), as.vector(lat), as.vector(ah))
crsLatLon <- "+proj=longlat +datum=WGS84"
ex <- extent(c(-180,180,-90,90))
pmraster <- raster(ncol=360*10, nrow=180*10, crs=crsLatLon,ext=ex)
pmraster <- rasterize(s1[,1:2], pmraster, s1[,3], fun=mean, na.rm=T)
exHI <- extent(c(-180,-140,10,30))
levelplot(crop(pmraster,exHI))
bigstack <- stack(bigstack, pmraster)
print("test")
}
stacking <- calc(bigstack, fun=mean, na.rm=T)
levelplot(crop(stacking, exHI))