R语言循环批量处理栅格图层分组时出现文件不存在错误如何解决
问题排查与解决方案
核心错误原因
你调用stack()时传入的是paste0()生成的字符串,raster包的stack()函数接收字符串参数时会默认当作本地文件路径去读取,而你代码里的ras_2015_PFT1到ras_2015_PFT8这类对象是存储在内存中的R变量,不是磁盘上的栅格文件,因此会抛出「文件不存在」的错误。
其他关联问题
- 大量使用
eval(parse())动态生成变量名是非常不推荐的写法,不仅调试难度高,也极易出现变量引用错误,建议用列表存储不同周期、不同变量的栅格对象,后续调用效率更高。 - 你在循环中给
ras赋值后,没有把读取到的栅格对象赋值给你动态生成的ras_xx_xx变量,就算解决了stack()的引用问题,后续调用这些动态变量时也会得到空的brick对象,引发新的错误。 - 分组逻辑写在
vari循环内部,会导致每遍历一个变量就重复执行一次分组操作,属于冗余代码。
推荐修正方案
优先改用列表存储栅格对象,避免动态生成变量,修正后的代码如下:
setwd(path_LU_fut) # 用列表统一存储所有栅格对象,方便后续调用 ras_list <- list() for(period in periods) { cat("\n ========> PERIOD ",period, "<======== \n") ncpath = "/home/joanpere/Modelling_data/path_LU_fut/" ncname = paste0("GCAM_Demeter_LU_O_ssp5_rcp85_miroc_", period) ncfname = paste0(ncpath, ncname, ".nc") # 初始化当前周期的子列表 ras_list[[as.character(period)]] <- list() # 遍历变量读取栅格 for(varis in vari) { ras_list[[as.character(period)]][[varis]] = brick(ncfname, varname = varis) } # 分组逻辑放到变量循环外执行 if(period == 2015) { # 批量从列表中提取对应PFT的栅格再stack ras_2015_forest = stack(ras_list[["2015"]][paste0("PFT",1:8)]) ras_2015_RID = stack(ras_list[["2015"]][c("PFT12", "PFT31")]) ras_2015_crop = stack(ras_list[["2015"]][paste0("PFT",15:30)]) ras_2015_no_forest = stack(ras_list[["2015"]][paste0("PFT",9:14)]) } }
如果你不想改动原有动态生成变量的逻辑,只需要快速修复当前报错,可把paste0()替换为mget()批量提取环境中的变量即可:
ras_2015_forest = stack(mget(paste0("ras_",period,"_PFT",1:8)))
内容的提问来源于stack exchange,提问作者joanpere
相关产品推荐
相关产品推荐

