R语言自定义频率表函数使用!!sym(group_var)报Invalid Argument Type错误
错误原因
- 核心问题为tidy evaluation(整洁求值)语法误用:
!!(解引用运算符)仅支持在dplyr/tidyr等tidyverse包的动词参数、:=运算符左右侧等特殊上下文环境中调用,你直接在普通变量赋值语句group_var2 <- !!sym(group_var)中使用!!,基础R的赋值环境无法识别该操作符,因此抛出参数类型无效错误。 - 原有代码还存在一处上下文指向错误:
bind_rows中嵌套的sapply(. %>% dplyr::select_if(is.numeric), ...)逻辑里,管道传递的.无法被内层的sapply正确识别,会导致合计行计算失败。
修复方案
调整代码逻辑,删除不合法的全局解引用赋值操作,将动态列名的解引用逻辑移到支持tidy eval的:=左值位置,同时新增中间变量存储分组统计结果,避免上下文指向混乱。修复后可运行代码如下:
library(dplyr) freq_table <- function(df, group_var) { # 第一步完成分组计数、占比计算 stat_result <- df %>% group_by_at(group_var) %>% summarise(n = n(), .groups = "drop") %>% mutate(freq = n / sum(n)) # 第二步单独计算合计行,动态指定分组列名 total_row <- stat_result %>% summarise( !!sym(group_var) := "Grand Total", across(where(is.numeric), ~sum(.x, na.rm = TRUE)) ) # 合并结果输出 return(bind_rows(stat_result, total_row)) } # 测试调用 freq_table(iris, group_var = "Species")
运行后输出符合预期:
# A tibble: 4 × 3 Species n freq <chr> <int> <dbl> 1 setosa 50 0.333 2 versicolor 50 0.333 3 virginica 50 0.333 4 Grand Total 150 1
内容的提问来源于stack exchange,提问作者Ujjawal Bhandari
相关产品推荐
相关产品推荐

