r - 将传递给 enquos 的值导出为格式 name1、name2、nameN、
问题描述
在这个例子中,我有一个简单的函数,它接受通过传递的变量名...
并利用该enquos
函数将它们传递给group_by
dplyr 中的运算符。
基本功能
# 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
转换为 format 字符串"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
因为后者具有误导性并且可能会被弃用。
推荐阅读
- video-streaming - 来自 IP 摄像机的“实时采样”(非流式传输)
- reactjs - 将页面路由到组件中:React
- outlook - 如何使用 C# 在我有写权限的其他用户日历中创建一个 evet?
- c - 桶排序段错误
- agda - Agda Data.Bool 求解器的使用
- angular - Angular、打字稿、谷歌图表 - 类型(日期|数字)[][] 不可分配给类型数组
> - c++ - C++ - 使用 std::list,如何打印对象私有成员的链表?
- python - 维基百科 API 包装器 WPTOOLS
- python - 如何从 apache 日志中获取 pandas 数据框?
- c# - ASP.NET Core Identity UserManager.IsInRole 调用在 2.2 中有效,但在 3.0 中抛出 InvalidOperation