如何在foreach循环中保留栅格图层的原始名称?
解决foreach并行处理栅格堆栈时保留原始名称的问题
你可以通过两种方式实现保留原始栅格名称的需求:
方法1:在foreach循环内为结果栅格设置名称
直接在并行循环中,对每个focal处理后的栅格对象设置对应的原始名称,生成的列表中每个栅格会自带名称,后续转成堆栈时会自动保留:
library(doParallel) library(foreach) library(raster) # 生成测试数据 r1 <- raster(nrows = 100, ncols = 100, res = 0.1, xmn = -1.5, xmx = 1.5, ymn = -1.5, ymx = 1.5, vals = 1) rr <- lapply(1:3, function(i) setValues(r1, runif(ncell(r1)))) rr <- stack(rr) names(rr) = c('name1', 'name2', 'name3') # 初始化并行集群 cl = makeCluster(detectCores() -1) registerDoParallel(cl) # 带名称设置的foreach循环 foreach_test = foreach(rasname = iter(names(rr)), .packages = "raster") %dopar% { focal_res <- raster::focal(rr[[rasname]], w = matrix(1, nrow=3, ncol=3), fun = cv, na.rm = TRUE) names(focal_res) <- rasname # 为结果栅格设置原始名称 focal_res } stopCluster(cl) # 转为栅格堆栈,名称已保留 result_stack <- stack(foreach_test)
方法2:对foreach返回的列表重命名后转堆栈
如果不想修改循环内部逻辑,可以先获取foreach的结果列表,再为列表元素设置原始名称,最后转为堆栈:
library(doParallel) library(foreach) library(raster) # 生成测试数据(同方法1) r1 <- raster(nrows = 100, ncols = 100, res = 0.1, xmn = -1.5, xmx = 1.5, ymn = -1.5, ymx = 1.5, vals = 1) rr <- lapply(1:3, function(i) setValues(r1, runif(ncell(r1)))) rr <- stack(rr) names(rr) = c('name1', 'name2', 'name3') # 初始化并行集群 cl = makeCluster(detectCores() -1) registerDoParallel(cl) # 原foreach循环逻辑不变 foreach_test = foreach(rasname = iter(names(rr)), .packages = "raster") %dopar% { raster::focal(rr[[rasname]], w = matrix(1, nrow=3, ncol=3), fun = cv, na.rm = TRUE) } stopCluster(cl) # 为列表元素设置原始名称 names(foreach_test) <- names(rr) # 转为栅格堆栈 result_stack <- stack(foreach_test)
注意事项
- 无需加载
dplyr、rgdal、plyr等未用到的包,减少不必要的依赖; - 如果
cv是自定义函数,需要在注册集群前用clusterExport()将函数导出到每个并行节点,确保集群能调用该函数。
内容的提问来源于stack exchange,提问作者user947548
相关产品推荐
相关产品推荐

