自定义函数中搭配dplyr {{}}使用aggregate时出现报错如何解决?
错误诱因
{{ }}是dplyr等tidyverse系列函数专属的整洁求值语法,仅支持适配了tidy eval规则的函数,而aggregate是R基础包的函数,无法识别该语法,会直接把{{level}}当做普通变量名解析,才会抛出变量长度不匹配的报错。- 函数外运行正常是因为你直接写了真实的列名作为公式项,不需要求值解析步骤,自然不会触发问题。
- 额外注意:你把自定义函数命名为
filter,而filter是dplyr的核心函数名,重名会导致命名空间冲突,后续使用中也可能引发其他异常。
解决方案
方案1:全用tidyverse语法实现逻辑(更推荐,和你原本用{{ }}的习惯适配)
用dplyr的group_by + summarise + across实现完全等价的按指定列分组求和所有其他列的效果,代码如下:
library(dplyr) my_aggregate <- function(df, level) { df <- df %>% group_by({{level}}) %>% summarise(across(everything(), sum, na.rm = TRUE)) return(df) } # 调用示例:假设要按class列分组求和 # result <- my_aggregate(your_df, class)
方案2:如果要保留base的aggregate函数,手动构造公式
不需要用{{ }},改用非标准求值手动生成公式即可:
my_aggregate <- function(df, level) { # 把传入的level参数转为字符串列名 level_col <- deparse(substitute(level)) # 构造公式 agg_formula <- as.formula(paste0(". ~ ", level_col)) df <- aggregate(agg_formula, data = df, FUN = sum) return(df) } # 调用方式和之前一致 # result <- my_aggregate(your_df, class)
内容的提问来源于stack exchange,提问作者keenan
相关产品推荐
相关产品推荐

