将传递给 enquos 的值导出为格式为 name1、name2、nameN 的字符串,

Exporting values passed to enquos as string of format name1,name2, nameN,

在这个例子中,我有一个简单的函数,它获取通过 ... 传递的变量名,并使用 dplyr 中的 enquos function in order to pass them to group_by 运算符。

基本功能

#  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"

备注

你可以使用 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,因为后者具有误导性并且会可能会被弃用。