我想了解如何将表示表达式的字符串传递给dplyr,以便在数据框中对列上的表达式求值。关于这个主题的主要说明文档涵盖了传递quosure,但根本没有讨论字符串。
显然,当表示表达式时,quosure比字符串更安全、更清晰,所以当quosure可以代替字符串时,我们应该避免使用字符串。然而,在与R生态系统外的工具(如JavaScript或YAML配置文件)一起工作时,人们通常必须使用字符串而不是quosure。
例如,假设我想要一个使用用户/调用者传入的表达式进行分组计数的函数。正如预期的那样,以下代码不起作用,因为dplyr使用非标准评估来解释
在dplyr 0.5中,我们使用标准评估,例如
对于仅为列名的表达式,我们可以使用这个问题的解决方案,但对于像
显然,当表示表达式时,quosure比字符串更安全、更清晰,所以当quosure可以代替字符串时,我们应该避免使用字符串。然而,在与R生态系统外的工具(如JavaScript或YAML配置文件)一起工作时,人们通常必须使用字符串而不是quosure。
例如,假设我想要一个使用用户/调用者传入的表达式进行分组计数的函数。正如预期的那样,以下代码不起作用,因为dplyr使用非标准评估来解释
group_by
的参数。library(tidyverse)
group_by_and_tally <- function(data, groups) {
data %>%
group_by(groups) %>%
tally()
}
my_groups <- c('2 * cyl', 'am')
mtcars %>%
group_by_and_tally(my_groups)
#> Error in grouped_df_impl(data, unname(vars), drop): Column `groups` is unknown
在dplyr 0.5中,我们使用标准评估,例如
group_by_(.dots = groups)
来处理这种情况。现在下划线动词已被弃用,那么在dplyr 0.7中我们应该如何处理这种情况?对于仅为列名的表达式,我们可以使用这个问题的解决方案,但对于像
2 * cyl
这样不仅是列名的更复杂的表达式则不适用。
!!
和!!!
,你就应该没问题了。 - yeedleUQ
和UQS
时,我更容易知道自己在做什么。 - Paulrlang::parse_expr
和rlang::parse_quosure
。谢谢!我已经将您的建议应用于我在https://groups.google.com/forum/#!topic/manipulatr/UyzWc-s_bos上获得的Shiny应用程序输入。 - Vincent