使用dplyr编写自定义函数时根据传入可选参数过滤指定值的问题
问题根源
hasArg(Occupation)仅能检测是否向函数传入了显式命名为Occupation的参数,而你调用函数时传入的Occupation是传递给...的未命名分组变量,不属于命名参数范畴,因此hasArg永远返回FALSE,过滤逻辑不会触发。
解决方法
借助rlang的 tidy evaluation 工具捕获...传入的所有分组变量的名称,判断是否包含Occupation后再执行对应过滤逻辑即可,修改后代码如下:
library(tidyverse) my_function <- function(..., dimension = NULL){ # 捕获所有传入的分组变量 group_vars <- enquos(...) # 判断分组变量中是否包含Occupation has_occupation <- "Occupation" %in% map_chr(group_vars, as_name) df %>% filter( Construct == dimension, # 动态添加过滤条件 if(has_occupation) Occupation != "I" else TRUE ) %>% # 解包分组变量 group_by(!!!group_vars, Score) %>% # 加.groups参数避免分组提示,同时保证占比计算逻辑正确 summarise(n = n(), .groups = "drop_last") %>% mutate(rate = round(n/sum(n), 2)) }
功能验证
- 调用
my_function(dimension = "X1", Site, Occupation)时,会自动过滤所有Occupation为"I"的记录再统计 - 调用
my_function(dimension = "X1", Site, Department)时,不会触发Occupation过滤,和原有逻辑完全一致
内容的提问来源于stack exchange,提问作者antvan
相关产品推荐
相关产品推荐

