将传递给 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"
备注
- 诚然,从函数内部为全局环境赋值并不是一个好的做法。这仅用于说明目的。实际上,关键目标是将
enquos
中的任何内容强制转换为 "name1, name2, ..."
. 格式的字符串
你可以使用 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
,因为后者具有误导性并且会可能会被弃用。
在这个例子中,我有一个简单的函数,它获取通过 ...
传递的变量名,并使用 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"
备注
- 诚然,从函数内部为全局环境赋值并不是一个好的做法。这仅用于说明目的。实际上,关键目标是将
enquos
中的任何内容强制转换为"name1, name2, ..."
. 格式的字符串
你可以使用 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
,因为后者具有误导性并且会可能会被弃用。