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, он все еще работает с другими объектами, но не будет делать то, что вы ожидаете. Вы должны использовать его только внутри функции и только с именами аргументов этой функции.