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

如何修复基于substitute与eval的data.table自定义函数嵌套调用报错

自定义mutate_dt嵌套调用报错修复方案

问题根因

原实现中eval默认在mutate_dt函数本身的环境中执行表达式,嵌套调用时上层函数传入的参数(如示例中的x)不在当前搜索环境中,因此会报对象找不到的错误。

修复方案(无额外依赖)

仅需在eval时指定执行环境为上层调用环境即可,修正后的完整代码如下:

library(data.table)
mutate_dt = function (.data, ..., by) 
{
    dt = as.data.table(.data)
    # 在上层调用环境中执行捕获的表达式即可识别上层函数的参数
    substitute(dt[, `:=`(...), by][]) %>% eval(envir = parent.frame())
}

功能验证

运行你提供的测试用例可正常返回结果:

t_f = function(dt,x){
  mutate_dt(dt,a = x)
}

# 执行无报错,新增的a列所有值为1,符合预期
t_f(iris,1)

更稳定的兼容方案(可选)

如果需要支持更复杂的动态参数、列名引用混合场景,可以基于rlang的整洁求值实现,兼容性更强:

library(data.table)
library(rlang)
mutate_dt = function (.data, ..., by = NULL) 
{
  dt = as.data.table(.data)
  dots = enquos(...)
  by_arg = enquo(by)
  dt[, !!!dots, by = !!by_arg][]
}

内容的提问来源于stack exchange,提问作者Hope

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:30:01