Quosures в R, как использовать! оператор (приборка-оценка)

Я пытаюсь понять аккуратную оценку в R.

grouped_mean <- function(data, group_var, summary_var) {
    group_var <- enquo(group_var)
    summary_var <- enquo(summary_var)

    data %>%
        group_by(!!group_var) %>%
        summarise(mean = mean(!!summary_var))
}

Я понимаю, почему и как это использовать, но не то, что на самом деле происходит, я думаю.

var <- "test"
var <- enquo(var)
!!var 

Error in is_quosure(e2) : argument "e2" is missing, with no default

Это дает мне ошибку, в то время как я ожидал, что это будет работать снаружи dplyr тоже. Почему это не работает и как я могу это исправить?

1 ответ

Решение

!! является оператором удаления кавычек, который работает только в контексте цитирования, то есть в аргументах для глаголов dplyr. Сообщение об ошибке, которое вы видите с !!quo(foo) это ошибка в текущей версии CRAN. С версией разработки, это теперь:

Error: Quosures can only be unquoted within a quasiquotation context.

  # Bad:
  list(!!myquosure)

  # Good:
  dplyr::mutate(data, !!myquosure)

Наконец, обратите внимание, что enquo() должен использоваться только для цитирования аргументов функции. По техническим причинам, связанным с компилятором R, он все еще работает с другими объектами, но не будет делать то, что вы ожидаете. Вы должны использовать его только внутри функции и только с именами аргументов этой функции.

Другие вопросы по тегам