如何协调 .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 )
我正在编写一个使用大量 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 )