获取函数内对象名称:deparse(substitute())的tidyverse替代方案
在tidyverse中为自定义汇总函数添加变量名的推荐方法
针对你基于dplyr vignette("programming")中示例函数的需求,除了deparse(substitute()),tidyverse推荐使用rlang包的tidyeval工具来实现获取参数变量名的功能,这类方法更贴合tidyverse的语法体系,以下是具体实现:
方法一:使用ensym() + as_label()
ensym()会将输入的表达式转换为符号对象,as_label()则将符号转换为对应的字符串,是tidyeval体系中处理这类场景的标准方式:
library(dplyr) library(rlang) my_summarise2 <- function(data, expr) { data %>% summarise( var = as_label(ensym(expr)), mean = mean({{ expr }}), sum = sum({{ expr }}), n = n() ) } # 调用测试 my_summarise2(iris, Petal.Width)
输出结果:
var mean sum n 1 Petal.Width 1.199333 179.9 150
方法二:简化嵌入写法
如果不需要单独保存变量名,可直接在summarise中完成转换,代码更紧凑:
my_summarise2 <- function(data, expr) { data %>% summarise( var = as_label(ensym(expr)), mean = mean({{ expr }}), sum = sum({{ expr }}), n = n() ) }
说明
rlang是tidyverse系列包的核心底层依赖,ensym()和as_label()都是官方推荐的tidyeval工具,相比deparse(substitute()),它们在处理复杂表达式时的行为更稳定,也更符合tidyverse的编程风格。
内容的提问来源于stack exchange,提问作者moreQthanA
相关产品推荐
相关产品推荐

