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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:21:04