lapply 在尝试堆叠栅格时创建无限循环
lapply creates endless loop when attempting to stack rasters
我正在尝试生成由我的目录中的其他堆叠光栅图像组成的单个光栅图像:
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)
}
现在获取文件名
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)
我的问题是使循环过于复杂并且包含违反直觉的组件,就像之前在评论中建议的那样。我将循环重新格式化为:
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))
我正在尝试生成由我的目录中的其他堆叠光栅图像组成的单个光栅图像:
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)
}
现在获取文件名
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)
我的问题是使循环过于复杂并且包含违反直觉的组件,就像之前在评论中建议的那样。我将循环重新格式化为:
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))