You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用terra包对SpatRaster单元格应用自定义归一化函数时出错求助

问题解决:栅格归一化函数的向量兼容修改

错误原因

terra::app()处理SpatRaster时,会把每个图层的所有单元格值以向量形式传入自定义函数,但你写的norm_formula是针对单个标量值的判断逻辑——当传入向量时,is.na(x)会返回布尔向量,直接用if语句判断就会触发"the condition has length > 1"的错误。

解决方案

方法1:将函数修改为向量化版本

把原函数中的if分支替换为支持向量运算的ifelse嵌套,让函数能直接处理向量输入:

norm_formula_vec <- function(x, min_value, max_value){
  norm_x <- ifelse(is.na(x) | is.nan(x), NA,
                   ifelse(x < min_value, 1,
                          ifelse(x > max_value, 100,
                                 (100-1)*((x - min_value)/(max_value - min_value)) + 1)))
  return(norm_x)
}

用修改后的函数运行:

library(terra)
r <- rast(ncol=3, nrow=2)
values(r) <- 1:ncell(r)

s <- app(r, fun= function(x) norm_formula_vec(x, 0, 0.5))

# 查看结果
values(s)

方法2:使用terra::classify()高效处理栅格

针对栅格的区间分类场景,terra提供的classify()函数比app()更适配:

library(terra)
r <- rast(ncol=3, nrow=2)
values(r) <- 1:ncell(r)

# 定义分类规则矩阵:[下限, 上限, 输出值/计算公式]
class_mat <- matrix(c(
  -Inf, 0, 1,
  0, 0.5, "99*((x - 0)/(0.5 - 0)) + 1",
  0.5, Inf, 100
), ncol=3, byrow=TRUE)

# 应用分类规则
s <- classify(r, class_mat, right = FALSE)

# 查看结果
values(s)

结果说明

你的测试栅格值为1到6,全部大于设定的最大值0.5,所以两种方法运行后,s的所有单元格值都会被映射为100,符合预期逻辑。

内容的提问来源于stack exchange,提问作者89_Simple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:33:17