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"))
原有代码错误原因
- 初始的
testfunc仅定义了1个形参,调用时传入2个参数自然触发「未使用参数」报错 testfunc2的错误有两点:一是仅定义1个形参不支持多参数直接传入,二是用!!而非!!!解包quosure列表,!!只能解包单个表达式,!!!才可以解包多元素的表达式列表。
内容的提问来源于stack exchange,提问作者s_a
相关产品推荐
相关产品推荐

