Tidy Eval, используя enquo с пакетом infer - PullRequest
0 голосов
/ 22 ноября 2018

Это мой первый вопрос на этом сайте.

Пакет infer, который я пытаюсь использовать, является частью tidyverse (tidymodels) link

library(tidyverse)
library(rlang)
library(infer)


mtcars$am <- as.factor(mtcars$am)

f <- function(dataset, col){
col <- enquo(col)
bootstrap <- dataset %>% 
specify(!!col ~ am ) %>% 
generate(reps = 100, type = "bootstrap") %>% 
calculate("diff in means", order = c("1", "0"))
 }


f(mtcars, mpg)

Error: The response variable `!` cannot be found in this dataframe.The     response variable `!col` cannot be found in this dataframe.
In addition: Warning message:
In if (!(as.character(attr(x, "response")) %in% names(x))) { :

 Show Traceback

 Rerun with Debug
 Error: The response variable `!` cannot be found in this dataframe.The   response     variable `!col` cannot be found in this dataframe. 

Я попытался использовать qq_show, и все выглядит нормально,поэтому я не понимаю ошибки.

1 Ответ

0 голосов
/ 23 ноября 2018

Вопрос в формуле.Мы можем использовать paste после преобразования выражения в строку (quo_name) и преобразовать строку в formula объект

f <- function(dataset, col){
  col <- enquo(col)
  dataset %>% 
    specify(as.formula(paste0(quo_name(col),  '~ am'))) %>% 
    generate(reps = 100, type = "bootstrap") %>% 
    calculate("diff in means", order = c("1", "0"))
   }

f(mtcars, mpg)
# A tibble: 100 x 2
#   replicate  stat
#       <int> <dbl>
# 1         1  8.41
# 2         2 10.7 
# 3         3  7.65
# 4         4  7.21
# 5         5  7.47
# 6         6  6.59
# 7         7  9.32
# 8         8  5.70
# 9         9  8.25
#10        10  6.24
# ... with 90 more rows

На основе предложения @Lionel Henry

f <- function(dataset, col){
      col <- ensym(col)
      g <- expr(!!col ~ am) 
      dataset %>% 
          specify(g) %>% 
          generate(reps = 100, type = "bootstrap") %>%
         calculate("diff in means", order = c("1", "0")) 
} 

f(mtcars, mpg)
...