R中的Quosures,如何使用!!操作员(整洁评估)

Quosures in R, how to use the !! operator (tidy-evaluation)

我想了解 R 中的 tidy 求值。

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 之外工作。为什么它不起作用,我该如何解决?

!! 是只在 引用上下文 中有效的非引用运算符,即在 dplyr 动词的参数中。您在 !!quo(foo) 中看到的错误消息是当前 CRAN 版本中的错误。有了开发版,现在是:

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

  # Bad:
  list(!!myquosure)

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

最后,请注意 enquo() 应该只用于引用函数参数。由于与 R 编译器有关的技术原因,它仍然适用于其他对象,但不会按照您的预期进行。您应该只在函数中使用它,并且只能使用该函数的参数名称。