3

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

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)

4

1 回答 1

1

一种选择是让 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 )
于 2020-11-30T19:22:33.387 回答