使用data.table自定义R分组求和函数时无法识别分组参数
解决方案
问题出在data.table的非标准求值机制:当你在函数中直接传递val和my_group参数时,data.table会默认去全局环境查找这些对象,而非函数的局部环境,因此抛出"object 'group' not found"错误。以下是两种在函数内部实现的修复方案:
方案一:使用tidyeval语法(依赖rlang包)
利用enquo()捕获参数表达式,再用!!解引用,让data.table正确识别函数内的参数:
library(data.table) library(rlang) data=data.table( group= c('a','b','b','c','c','c'), value=1:6 ) sum_value_by_group<-function(dt, val, my_group) { # 捕获参数表达式 val_expr <- enquo(val) group_expr <- enquo(my_group) # 解引用后传入data.table dt[, group_value:= sum(!!val_expr), by = !!group_expr] return(dt) } # 调用测试 sum_value_by_group(data, value, group)
方案二:使用base R的substitute(无需额外包)
通过substitute()将参数转换为表达式,再在data.table的环境中求值:
library(data.table) data=data.table( group= c('a','b','b','c','c','c'), value=1:6 ) sum_value_by_group<-function(dt, val, my_group) { dt[, group_value:= sum(eval(substitute(val))), by = substitute(my_group)] return(dt) } # 调用测试 sum_value_by_group(data, value, group)
两种方案都能让函数正确识别参数,输出结果如下:
group value group_value 1: a 1 1 2: b 2 5 3: b 3 5 4: c 4 15 5: c 5 15 6: c 6 15
内容的提问来源于stack exchange,提问作者dll
相关产品推荐
相关产品推荐

