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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:30:39