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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:33:25