首页 > 解决方案 > 将传递给 enquos 的值导出为格式 name1、name2、nameN、

问题描述

在这个例子中,我有一个简单的函数,它接受通过传递的变量名...并利用该enquos函数将它们传递给group_bydplyr 中的运算符。

基本功能

#  Libraries
library(dplyr)
library(rlang)
sample_function <- function(x, ...) {
    group_vars <- enquos(...)

    x %>%
        group_by(!!!group_vars) %>%
        summarise(num_obs = n())
}

结果

mtcars %>% sample_function(cyl, am)
# A tibble: 6 x 3
# Groups:   cyl [3]
    cyl    am num_obs
  <dbl> <dbl>   <int>
1     4     0       3
2     4     1       8
3     6     0       4
4     6     1       3
5     8     0      12
6     8     1       2

问题

我想扩展上面的函数,除了生成的结果之外,还创建一个新的标量字符,该字符将反映以enquos格式传递给的变量的名称:"var1, var2, ...".

试图

library(dplyr)
library(rlang)
sample_function <- function(x, ...) {
    group_vars <- enquos(...)

    # Problem:
    # Create test object of quoted variables
    assign(x = "used_group_variables",
           value = quo_text(group_vars),
           envir = globalenv())

    # Summary
    x %>%
        group_by(!!!group_vars) %>%
        summarise(num_obs = n())
}

结果

生成的字符串与所需的格式不匹配。

used_group_variables
# [1] "structure(list(~cyl, ~am), .Names = c(\"\", \"\"), class = c(\"quosures\", \n\"list\"))"

期望的结果

只有最初通过的所有变量的名称enquos被返回并与“`”作为分隔符一起粘贴。

used_group_variables
# "cyl, am"

笔记

标签: rdplyrrlangtidyeval

解决方案


您可以使用sapply它并使用以下方法折叠toString

sample_function <- function(x, ...) {
  group_vars <- enquos(...)

  assign(x = "used_group_variables",
         value = toString(sapply(group_vars, quo_name)),
         envir = globalenv())

  x %>%
    group_by(!!!group_vars) %>%
    summarise(num_obs = n())
}

输出:

mtcars %>% sample_function(am, cyl)

used_group_variables
# [1] "am, cyl"

编辑:正如@LionelHenry 在评论中所建议的那样,您可能想要使用as_label而不是quo_name因为后者具有误导性并且可能会被弃用。


推荐阅读