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

如何在函数内的case_when()中动态引用传入的列名?

更优雅地在case_when中动态引用传入的列名

你可以利用dplyr提供的.data代词直接引用字符型列名,无需手动转换为符号,代码会更简洁直观。同时,由于grepl()本身就返回逻辑值(TRUE/FALSE),完全可以省去case_when()的冗余写法,进一步简化代码:

优化后的函数

test_tibble <- tibble(col_a = c("Here I am", "Nope", "Nothing", "I am here"))

test_function <- function(target_item,
                          data = test_tibble,
                          variable_name,
                          prefix = "check_") {
  
  data %>% 
    mutate("{prefix}{target_item}" := grepl(target_item, .data[[variable_name]]))
}

# 调用测试
test_function("ere", variable_name = "col_a")

关键说明

  1. .data[[variable_name]]的作用:
    .data是dplyr中的特殊代词,专门用于在tidyverse函数中通过字符向量引用列名。直接用.data[[variable_name]]就能访问传入的字符型列名,省去了as.symbol()和{{}}的转换步骤,完全适配你处理多个不同命名列的场景。

  2. 去掉冗余的case_when():
    grepl(target_item, x)本身就会返回与x长度一致的逻辑向量,不需要用case_when()再做一次TRUE/FALSE的映射,直接把grepl()的结果赋值给新列即可,代码更高效简洁。

如果你的场景确实需要保留case_when()(比如后续要添加更多判断条件),也可以用.data代词配合case_when():

test_function <- function(target_item,
                          data = test_tibble,
                          variable_name,
                          prefix = "check_") {
  
  data %>% 
    mutate("{prefix}{target_item}" := case_when(
      grepl(target_item, .data[[variable_name]]) ~ TRUE,
      # 这里可以添加其他判断条件
      TRUE ~ FALSE
    ))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:55:22