在R中计算热指数时如何对栅格特定网格单元应用函数?
栅格热指数计算问题解决方案
关键错误分析
你遇到的问题来自两个核心点:
- 标量
if语句不支持栅格对象:普通if只能处理单个逻辑值,但栅格是向量式结构,iheat_index > 80会返回一个逻辑向量,导致"参数无法解析为逻辑值"错误。 - 函数调用方式错误:使用
calc()或overlay()时,fun参数需要传入函数对象(如fun_heat_index),而非直接执行函数(如fun_heat_index(...));同时overlay的参数顺序需与函数定义匹配。
修改后的向量化热指数函数
将所有标量if替换为向量化的ifelse,确保函数能处理栅格/向量输入:
fun_heat_index <- function(RH, T){ # RH: 相对湿度(百分比)栅格/向量 # T: 最高温度(华氏度)栅格/向量 # 初始简单公式计算 iheat_index <- 0.5 * (T + 61 + ((T-68) * 1.2) + (RH * 0.094)) # 当初始HI>80时,替换为复杂公式 complex_hi <- -42.379 + 2.04901523 * T + 10.14333127 * RH - 0.22475541 * T * RH - 0.00683783 * T^2 - 0.05481717 * RH^2 + 0.00122874 * T^2 * RH + 0.00085282 * T * RH^2 - 0.00000199 * T^2 * RH^2 iheat_index <- ifelse(iheat_index > 80, complex_hi, iheat_index) # 调整项1:RH<13且T在80-112之间 adj1 <- ((13 - RH) / 4) * sqrt((17 - abs(T - 95)) / 17) cond1 <- RH < 13 & T >= 80 & T <= 112 iheat_index <- ifelse(cond1, iheat_index + adj1, iheat_index) # 调整项2:RH>85且T在80-87之间 adj2 <- ((RH - 85) / 10) * ((87 - T) / 5) cond2 <- RH > 85 & T >= 80 & T <= 87 iheat_index <- ifelse(cond2, iheat_index + adj2, iheat_index) return(iheat_index) }
正确调用方式
方式1:使用overlay()(推荐多栅格场景)
overlay()自动匹配两个栅格的对应单元格,注意参数顺序需与函数定义一致(函数第一个参数是RH,第二个是T):
# 假设湿度栅格为relative_humidity_data,温度栅格为tmax_data hi_raster <- overlay(relative_humidity_data, tmax_data, fun = fun_heat_index)
方式2:合并栅格后用calc()
将两个栅格合并为RasterStack,再通过匿名函数指定参数顺序:
raster_stack <- stack(tmax_data, relative_humidity_data) hi_raster <- calc(raster_stack, fun = function(x) fun_heat_index(x[2], x[1])) # x[1]对应stack中的第一个栅格(tmax),x[2]对应第二个栅格(RH)
方式3:提取值计算后转回栅格
如果坚持用getValues(),通过setValues()将结果绑定到原栅格模板:
# 提取单元格值 t_vals <- getValues(tmax_data) rh_vals <- getValues(relative_humidity_data) # 计算热指数 hi_vals <- fun_heat_index(rh_vals, t_vals) # 生成结果栅格(用原温度栅格作为模板) hi_raster <- setValues(tmax_data, hi_vals)
内容的提问来源于stack exchange,提问作者climeowt_change
相关产品推荐
相关产品推荐

