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

dplyr非标准评估场景下如何向函数间接传递多个参数

通用解决方案

dplyr 支持单/多变量传参的核心逻辑分为两类:要么用动态点...接收任意数量参数,要么将多参数捕获为 quosure 列表后用!!!解包,以下是不同场景的可直接复用实现:


场景1:直接接收任意数量未求值的列名(最常用)

直接用...作为形参,不需要额外的非标准求值语法:

library(dplyr)
df <- as_tibble(mtcars)

testfunc <- function(...) {
  df %>% 
    group_by(...) %>% 
    summarise(mpg = mean(mpg), .groups = "drop")
}

# 单变量测试
testfunc(cyl)
# 多变量测试
testfunc(cyl, gear)

两种调用均可得到正确结果。


场景2:单个形参接收单个/多个未求值列名

如果要求所有分组变量统一传入一个variables参数,用enquos的.multiple = TRUE参数捕获多表达式,再用!!!解包传入group_by:

testfunc2 <- function(variables) {
  # 捕获单个或多个未求值表达式为quosure列表
  variables <- enquos(variables, .multiple = TRUE)
  df %>% 
    # 用!!!解包quosure列表
    group_by(!!!variables) %>% 
    summarise(mpg = mean(mpg), .groups = "drop")
}

# 单变量测试
testfunc2(cyl)
# 多变量测试
testfunc2(c(cyl, gear))

场景3:接收字符串格式的列名向量

如果传入的是列名字符串向量,搭配all_of()和across()即可:

testfunc_str <- function(variables) {
  df %>% 
    group_by(across(all_of(variables))) %>% 
    summarise(mpg = mean(mpg), .groups = "drop")
}

# 测试
testfunc_str(c("cyl", "gear"))

原有代码错误原因

  1. 初始的testfunc仅定义了1个形参,调用时传入2个参数自然触发「未使用参数」报错
  2. testfunc2的错误有两点:一是仅定义1个形参不支持多参数直接传入,二是用!!而非!!!解包quosure列表,!!只能解包单个表达式,!!!才可以解包多元素的表达式列表。

内容的提问来源于stack exchange,提问作者s_a

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:51:02