tidyselect::eval_select重复名自动加数字 如何保留原始LHS输入名称
解决方案
方案1(推荐,tidyselect >= 1.1.0)
直接修改eval_select的.name_repair参数即可,默认的unique模式会自动给重复名称加数字后缀,改成minimal就会保留原始名称:
library(tidyverse) test <- function(.data, ...) { # 新增.name_repair = "minimal"参数关闭自动去重 loc <- tidyselect::eval_select(rlang::expr(c(...)), .data, .name_repair = "minimal") list(names(loc), names(.data)[loc]) }
测试效果:
data <- mtcars[, 8:11] data %>% test(foo = 1, bar = c(2:4), foobar = c(1, "am", "gear", "carb")) #> [[1]] #> [1] "foo" "bar" "bar" "bar" "foobar" "foobar" "foobar" #> [8] "foobar" #> #> [[2]] #> [1] "vs" "am" "gear" "carb" "vs" "am" "gear" "carb"
方案2(兼容旧版本tidyselect)
如果需要兼容更早的tidyselect版本,可以通过手动捕获参数、匹配选择长度生成原始名称向量:
test <- function(.data, ...) { # 捕获所有传入的参数,保留原始名称 dots <- rlang::enquos(...) loc <- tidyselect::eval_select(rlang::expr(c(...)), .data) # 计算每个参数选中的列数 dot_lengths <- purrr::map_int(dots, ~length(tidyselect::eval_select(.x, .data))) # 重复原始名称对应次数,生成目标名称向量 raw_names <- rep(names(dots), dot_lengths) list(raw_names, names(.data)[loc]) }
效果和方案1完全一致,不需要依赖新版本的参数支持。
内容的提问来源于stack exchange,提问作者Claudiu Papasteri
相关产品推荐
相关产品推荐

