如何解决R语言{terra}包lapp函数条件更新栅格值时的重复更新问题?
解决terra包lapp函数中栅格值被重复修改的问题
我明白你的问题啦——你在更新rast_a的时候,第一次修改后的值触发了第二个条件判断,导致原本只需要处理一次的单元格被二次修改,最终结果不符合预期。咱们来一步步解决这个问题:
问题根源
你的原始函数中,当处理a == 1的单元格时,把值改成了b + 10 + 20 - 30(也就是2,因为rast_b的所有值都是2)。这时候这个单元格的a已经变成了2,紧接着就会触发第二个条件a == 2,导致它被再次修改,这就是为什么你得到的第一个值是3而不是预期的2。
解决方案:基于原始值判断
核心思路是用原始的a值做条件判断,而不是修改过程中的a值。你可以先把原始的a值保存下来,后续所有判断都基于这个备份值:
my_update_formula <- function(a, b, c) { original_a <- a # 保存初始的栅格值,避免被后续修改影响 # 所有条件判断都基于原始值 a[original_a == 1] <- b[original_a == 1] + 10 + 20 - 30 a[original_a == 2] <- c[original_a == 2] + 10 + 50 - 50 return(a) }
测试验证
运行修改后的代码:
rast_a <- rast(ncol = 2, nrow = 2) values(rast_a) <- 1:4 rast_b <- rast(ncol = 2, nrow = 2) values(rast_b) <- c(2,2,2,2) rast_c <- rast(ncol = 2, nrow = 2) values(rast_c) <- c(3,3,3,3) result <- lapp(c(rast_a, rast_b, rast_c), fun = my_update_formula) values(result)
此时输出的结果就是你预期的:2, 3, 3, 4。
更简洁的替代方案:使用case_when
如果你喜欢更简洁的向量化写法,可以用dplyr::case_when,它会按顺序基于原始的a值判断,不会出现重复修改的问题:
my_update_formula <- function(a, b, c) { dplyr::case_when( a == 1 ~ b + 10 + 20 - 30, a == 2 ~ c + 10 + 50 - 50, TRUE ~ a # 其他数值保持原值不变 ) }
这个写法逻辑清晰,也能完美解决你的问题。
内容的提问来源于stack exchange,提问作者TheRealJimShady
相关产品推荐
相关产品推荐

