如何将表示表达式的字符串传递给dplyr 0.7动词? [英] How to pass strings denoting expressions to dplyr 0.7 verbs?

查看:89
本文介绍了如何将表示表达式的字符串传递给dplyr 0.7动词?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想了解如何将表示表达式的字符串传递给dplyr,以便将该字符串中提及的变量作为表达式在数据帧中的列中进行求值.关于此主题的主插图涵盖了传递保证,并且根本没有讨论字符串

I would like to understand how to pass strings representing expressions into dplyr, so that the variables mentioned in the string are evaluated as expressions on columns in the dataframe. The main vignette on this topic covers passing in quosures, and doesn't discuss strings at all.

很明显,当表示表达式时,与字符串相比,安全性更安全,更清晰,因此,当可以使用安全性代替时,我们当然应该避免使用字符串.但是,当使用R生态系统之外的工具(例如javascript或YAML配置文件)时,通常将不得不使用字符串而不是使用数量.

It's clear that quosures are safer and clearer than strings when representing expressions, so of course we should avoid strings when quosures can be used instead. However, when working with tools outside the R ecosystem, such as javascript or YAML config files, one will often have to work with strings instead of quosures.

例如,说我想要一个函数,该函数使用用户/调用者传递的表达式进行分组计数.正如预期的那样,以下代码无效,因为dplyr使用非标准评估来解释group_by的参数.

For example, say I want a function that does a grouped tally using expressions passed in by the user/caller. As expected, the following code doesn't work, since dplyr uses nonstandard evaluation to interpret the arguments to 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中应该如何做?

In dplyr 0.5 we would use standard evaluation, such as group_by_(.dots = groups), to handle this situation. Now that the underscore verbs are deprecated, how should we do this kind of thing in dplyr 0.7?

在只是列名的表达式的特殊情况下,我们可以使用解决方案来

In the special case of expressions that are just column names we can use the solutions to this question, but they don't work for more complex expressions like 2 * cyl that aren't just a column name.

推荐答案

请注意,在这个简单的示例中,我们可以控制表达式的创建方式.因此,传递表达式的最佳方法是直接使用quos()构造和传递quosures:

It's important to note that, in this simple example, we have control of how the expressions are created. So the best way to pass the expressions is to construct and pass quosures directly using quos():

library(tidyverse)
library(rlang)

group_by_and_tally <- function(data, groups) {
  data %>%
    group_by(UQS(groups)) %>%
    tally()
}

my_groups <- quos(2 * cyl, am)
mtcars %>%
  group_by_and_tally(my_groups)
#> # A tibble: 6 x 3
#> # Groups:   2 * cyl [?]
#>   `2 * cyl`    am     n
#>       <dbl> <dbl> <int>
#> 1         8     0     3
#> 2         8     1     8
#> 3        12     0     4
#> 4        12     1     3
#> 5        16     0    12
#> 6        16     1     2

但是,如果我们以字符串形式从外部来源接收到表达式,则可以先简单地解析这些表达式,然后将它们转换为quosures.

However, if we receive the expressions from an outside source in the form of strings, we can simply parse the expressions first, which converts them to quosures:

my_groups <- c('2 * cyl', 'am')
my_groups <- my_groups %>% map(parse_quosure)
mtcars %>%
  group_by_and_tally(my_groups)
#> # A tibble: 6 x 3
#> # Groups:   2 * cyl [?]
#>   `2 * cyl`    am     n
#>       <dbl> <dbl> <int>
#> 1         8     0     3
#> 2         8     1     8
#> 3        12     0     4
#> 4        12     1     3
#> 5        16     0    12
#> 6        16     1     2

同样,仅当我们从以字符串形式提供表达式的外部源中获取表达式时,才应执行此操作;否则,我们应直接在R源代码中进行确定.

Again, we should only do this if we are getting expressions from an outside source that provides them as strings - otherwise we should make quosures directly in the R source code.

这篇关于如何将表示表达式的字符串传递给dplyr 0.7动词?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆