如何修复基于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
相关产品推荐
相关产品推荐

