如何在函数内的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")
关键说明
.data[[variable_name]]的作用:.data是dplyr中的特殊代词,专门用于在tidyverse函数中通过字符向量引用列名。直接用.data[[variable_name]]就能访问传入的字符型列名,省去了as.symbol()和{{}}的转换步骤,完全适配你处理多个不同命名列的场景。去掉冗余的
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
相关产品推荐
相关产品推荐

