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

R语言中如何在函数内传递列名给bi_class实现双变量地图分组

问题解决方法

问题核心是bi_class函数无法直接识别通过字符串传递的列名,需要通过强制求值的方式将参数注入到函数调用中。以下是修正后的完整方案:

修正后的函数代码

create_sf_func <- function(yrqrt, variable) {
  # 将字符串参数转换为可识别的列名符号
  var_sym <- rlang::ensym(variable)
  
  # 用!!强制解析符号,传递给bi_class的y参数
  df2 <- bi_class(df, x = TestRate, y = !!var_sym, style = "quantile", dim = 3)
  
  df_filtered <- sf::st_as_sf(df2 %>% 
                                filter(YrQrt == yrqrt) %>% 
                                right_join(all_fips, by = "FIPS5") %>% 
                                mutate(geometry = fips_geometry(FIPS5)) %>% 
                                filter(FIPS5 < 60), 
                              crs = 4269) %>% 
    shift_geometry()
  return(df_filtered)
}

关键修正点

  • 使用rlang::ensym()将传入的字符串类型列名转换为R可识别的符号对象
  • 在bi_class的y参数前添加!!(强制求值运算符),让R将符号解析为数据框中的实际列
  • 简化right_join的by参数,因两边列名一致,直接写"FIPS5"即可

测试调用示例

# 生成CaseRate的2022Q2数据
df_cases2022Q2 <- create_sf_func("2022Q2", "CaseRate")
# 生成DeathRate的2022Q1数据
df_deaths2022Q1 <- create_sf_func("2022Q1", "DeathRate")

替代方案(不依赖rlang)

如果不想使用rlang包,可用基础R的as.name()实现相同效果:

create_sf_func <- function(yrqrt, variable) {
  var_sym <- as.name(variable)
  df2 <- bi_class(df, x = TestRate, y = !!var_sym, style = "quantile", dim = 3)
  
  # 后续代码与修正版一致
  df_filtered <- sf::st_as_sf(df2 %>% 
                                filter(YrQrt == yrqrt) %>% 
                                right_join(all_fips, by = "FIPS5") %>% 
                                mutate(geometry = fips_geometry(FIPS5)) %>% 
                                filter(FIPS5 < 60), 
                              crs = 4269) %>% 
    shift_geometry()
  return(df_filtered)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:50:43