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

获取函数内对象名称: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:18:13