如何协调 .data 代词与 rlang::enquo

How to reconcile .data pronouns with rlang::enquo

我正在编写一个使用大量 dplyr 函数的程序包 - 为了通过 devtools::check() 中的所有测试,我必须经常使用 .data。一些功能嵌套到其他功能中。在下面的示例中,我需要在 tidyselect 上下文和标准评估中(在创建 id).

的部分中使用 variable
df <- data.frame(
  V1 = 1:8,
  V2 = rep(1:4,2)
)

test <- function(df, variable){
  
  x <- df %>%
    mutate(y = {{variable}} + 1)

  id <- rlang::as_name(rlang::enquo(variable))
  
  id_eq <- outer(df[[id]], df[[id]], `==`)
  
  list(x, id_eq)
}

如果在 CMD 检查中没有收到任何警告或注释,我不知道如何处理这个问题。 如果我 运行 test(df = df, variable = V1) 该函数有效,但与 test(df = df, variable = .data$V1)

无效

一种选择是让 tidyverse 完成查找正确变量的工作。将这项工作的输出存储到一个临时变量中,并在整个函数中使用该变量:

test <- function(df, variable){

    tmp <- df %>% mutate( .tmp = {{variable}} ) %>% pull(.tmp)

    x <- df %>%
        mutate(y = tmp + 1)

    id_eq <- outer(tmp, tmp, `==`)

    list(x, id_eq)
}

该函数适用于所有合理的变量引用,包括 .data.env 代词:

test( df, V1 )
test( df, .data$V1 )

V1 <- 11:18
test( df, .env$V1 )