R语言中如何向参数实现非标准评估的函数传递变量
R非标准评估参数的函数封装问题及解决方案
问题描述
我想要封装一个来自R包的函数,从源码来看它的部分参数实现了非标准评估。我该如何编写自己的函数,将值传入这个实现了非标准评估的参数?
示例函数逻辑
下面是模拟的目标R包函数实现,和heatwaveR包exceedance函数的非标准评估逻辑一致:
data <- data.frame(name = 1:10) # 模拟R包中的目标函数,使用了非标准评估 toy.fun <- function(dat, var) { eval(substitute(var), dat) } # 直接调用可以正常执行 > toy.fun(data, name) [1] 1 2 3 4 5 6 7 8 9 10
错误封装示例
最初的封装尝试会触发变量找不到的报错:
toy.fun2 <- function(dat, var2) { var_name <- deparse(substitute(var2)) # 模拟业务场景中的数据筛选操作 data_subset <- dat[var_name] toy.fun(data_subset, var2) } > toy.fun2(data, name) Error in eval(substitute(var), dat) : object 'var2' not found
需求说明
我希望在包装函数中通过var2传入不同的变量名,这样当数据中存在不同变量名时,可以同时用该名称完成数据筛选,以及传入我要封装的目标函数。
解决方案
只需将包含参数的完整函数调用替换后再求值即可解决问题,最终实现代码如下:
toy.fun2 <- function(dat, var2) { var_name <- deparse(substitute(var2)) # 模拟业务场景中的数据筛选操作 data_subset <- dat[var_name] exprs <- substitute(toy.fun(data_subset, var2)) eval(exprs, parent.frame()) # 若要在data.table中运行该逻辑,可补充传入envir参数 }
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

