使用带有 tidy-select 的符号列表

Using a list of symbols with tidy-select

在我们的数据聚合管道中,我们有一堆用于定义组的条件变量。为了提高代码的可读性和可维护性,我们使用一个预配置的符号列表,按照这个说明性片段进行整洁的评估:

# this is the list of our condition variables 
condition_vars <- rlang::exprs(var1, var2, var3)

# split the data into groups
data %>% group_by(!!!condition_vars) %>% summarize(...)

这很好用,但我不知道在 <tidy-select> 上下文中使用它的优雅方式是什么,例如对于像 nest 这样的东西。问题是新 nest() 想要 nest(data = c(var1, var2, var3)) 而不是 nest(var1, var2, var3),所以 nest(!!!condition_vars) 会给我一个警告。

我能想到的最好的是

df <- tibble(x = c(1, 1, 1, 2, 2, 3), y = 1:6, z = 6:1)
vars <- exprs(y, z)
nest(df, data = !!call2("c", !!!vars))

但肯定有更好的方法...

你可以nest(df, data = c(!!!vars)).

但如今,如果表达式是简单的列名,我会将它们存储在字符向量中。您可以在选择上下文中提供带有 all_of() 的字符向量。在 mutate()group_by() 等动作动词中,使用 across() 创建一个选择上下文,您可以在其中使用 all_of()(以及其他功能,例如 starts_with())。

cols <- c("cyl", "am")

mtcars %>% group_by(across(all_of(cols))
mtcars %>% nest(data = all_of(cols))