如何让R自定义函数同时支持传入变量名和变量转换表达式
实现方案
你要的效果可以通过R的非标准求值(NSE)逻辑实现,两种常用写法如下:
基础R实现(无额外依赖)
my_fun <- function(data, var) { # 捕获传入的未求值表达式 var_expr <- substitute(var) # 在data的环境中计算表达式 eval_res <- eval(var_expr, envir = data, enclos = parent.frame()) # 返回计算结果的类型 class(eval_res) }
测试效果
构造示例数据:
df <- data.frame(a=1:10, b= 1:10, c= 1:10)
调用测试:
my_fun(df, a)会返回numericmy_fun(df, as.factor(a))会返回factor
实现原理
你原来的代码逻辑是直接把传入的参数转成字符串去取数据框列,当传入as.factor(a)时,得到的字符串是"as.factor(a)",数据框不存在该名称的列,自然无法得到预期结果。
新的实现先捕获用户传入的未求值表达式,再将表达式放到数据框的环境中执行,就可以和ggplot2的aes()一样,支持直接写变量名、甚至对变量做转换计算的写法。
Tidyverse风格实现(适合批量开发tidy类函数)
如果平时常用tidyverse系列工具,可以用rlang包的整洁求值逻辑实现,健壮性更高:
library(rlang) my_fun <- function(data, var) { var_quo <- enquo(var) eval_res <- eval_tidy(var_quo, data = data) class(eval_res) }
内容的提问来源于stack exchange,提问作者user11538509
相关产品推荐
相关产品推荐

