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
相关产品推荐
相关产品推荐

