如何在R的futureHighs函数中实现城市不在数据集时返回有效错误
修正后的函数实现
首先明确原代码的核心问题:
- 错误使用
missing()函数:该函数仅用于检测函数参数是否未提供,无法判断城市是否在数据集中 - 硬编码固定城市名"Ankara",未使用传入的
city参数 if语句语法错误,缺少必要括号且逻辑判断完全偏离需求
以下是修正后的函数:
library(dplyr) futureHighs <- function(ex, city){ # 检查城市是否存在于数据集 if(!city %in% ex$city){ stop(paste0("城市 '", city, "' 不在数据集中,请检查输入")) } # 先统一过滤年份范围,减少重复代码 filtered_data <- ex %>% filter(year >= 2080 & year <= 2100) # 计算RCP2.6情景下的平均高温 high_temp_2.6 <- filtered_data %>% filter(scenario == "RCP2.6", city == .env$city) %>% pull(txx) %>% mean(na.rm = TRUE) # 处理可能的缺失值 # 计算RCP8.5情景下的平均高温 high_temp_8.5 <- filtered_data %>% filter(scenario == "RCP8.5", city == .env$city) %>% pull(txx) %>% mean(na.rm = TRUE) # 返回命名列表 list(HighTemp2.6 = high_temp_2.6, HighTemp8.5 = high_temp_8.5) }
关键修改点
- 错误处理逻辑:用
!city %in% ex$city判断城市是否存在,不存在时抛出包含具体城市名的错误信息 - 移除硬编码:将所有固定的"Ankara"替换为函数参数
city,使用.env$city明确引用函数参数,避免和数据框列名冲突 - 代码优化:先统一过滤年份范围,减少重复代码;使用
pull()直接提取向量简化均值计算;添加na.rm = TRUE处理缺失值 - 语法修正:修复
if语句的括号和缩进问题,保证逻辑结构正确
可选简化版本
如果想进一步精简代码,可通过分组汇总一次性计算两个情景的均值:
futureHighs <- function(ex, city){ if(!city %in% ex$city){ stop(paste0("城市 '", city, "' 不在数据集中,请检查输入")) } result <- ex %>% filter(year >= 2080 & year <= 2100, city == .env$city) %>% filter(scenario %in% c("RCP2.6", "RCP8.5")) %>% group_by(scenario) %>% summarise(mean_temp = mean(txx, na.rm = TRUE), .groups = "drop") %>% tidyr::pivot_wider(names_from = scenario, values_from = mean_temp) %>% rename(HighTemp2.6 = RCP2.6, HighTemp8.5 = RCP8.5) %>% as.list() return(result) }
内容的提问来源于stack exchange,提问作者Matzo
相关产品推荐
相关产品推荐

