ошибка в оценке пользовательских аргументов с использованием `rlang` - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь написать функцию, которая отображает результаты теста Бартлетта, но у меня возникают проблемы с использованием rlang для правильной оценки пользовательских аргументов в конвейерной цепочке операций и в формуле.Что я делаю не так и как я могу заставить это работать?

library(tidyverse)

# function body
tryfn <- function(data, x, y) {
  # creating a dataframe (works)
  data <-
    dplyr::select(
      .data = data,
      !!rlang::enquo(x),
      !!rlang::enquo(y)
    )
  print(head(data))

  # convert the grouping variable to factor (doesn't work)
  data %<>%
    stats::na.omit(.) %>%
    dplyr::mutate_at(
      .tbl = .,
      .vars = !!rlang::enquo(x),
      .funs = ~base::droplevels(x = base::as.factor(x = .))
    )
  print(head(data))

  # running the test (doesn't work)
  bartlett <- stats::bartlett.test(
    formula = !!rlang::enquo(y) ~ !!rlang::enquo(x),
    data = data,
    na.action = na.omit
  )

  print(summary(bartlett))
}

# using the function
tryfn(
  data = mtcars,
  x = am,
  y = wt
)
#>                   am    wt
#> Mazda RX4          1 2.620
#> Mazda RX4 Wag      1 2.875
#> Datsun 710         1 2.320
#> Hornet 4 Drive     0 3.215
#> Hornet Sportabout  0 3.440
#> Valiant            0 3.460
#> Error in !rlang::enquo(x): invalid argument type

Создано в 2018-10-07 пакетом prex (v0.2.1)

1 Ответ

0 голосов
/ 07 октября 2018

Мы могли бы передавать строковые объекты в .var.Так что конвертируйте выражение в quo_name и используйте это

tryfn <- function(data, x, y) {
  # creating a dataframe (works)
  x <- enquo(x)
  y <- enquo(y)
  x1 <- quo_name(x)
  y1 <- quo_name(y)
  data <-
    dplyr::select(
      .data = data,
      !!x,
      !!y
    )
  print(head(data))

  fml <- formula(paste0(y1, " ~ ", x1))


  # convert the grouping variable to factor (doesn't work)
  data <- data %>%
    stats::na.omit(.) %>%
    dplyr::mutate_at(
      .var = x1,
      .funs = ~base::droplevels(x = base::as.factor(x = .x))
    )
    bartlett <- stats::bartlett.test(
       formula = fml,
       data = data,
       na.action = na.omit
     )

    bartlett    

}

-test

# using the function
out <- tryfn(
  data = mtcars,
  x = am,
  y = wt
)

out

#   Bartlett test of homogeneity of variances

#data:  wt by am
#Bartlett's K-squared = 0.71483, df = 1, p-value = 0.3978
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...