在当前版本的 dplyr 中,select
参数可以按值传递:
variable <- "Species"
iris %>%
select(variable)
# Species
#1 setosa
#2 setosa
#3 setosa
#4 setosa
#5 setosa
#6 setosa
#...
但是
group_by
参数不能按值传递:iris %>%
group_by(variable) %>%
summarise(Petal.Length = mean(Petal.Length))
# Error in grouped_df_impl(data, unname(vars), drop) :
# Column `variable` is unknown
documented dplyr::select behaviour是
iris %>% select(Species)
以及记录在案的 documented dplyr::group_by behaviour是
iris %>%
group_by(Species) %>%
summarise(Petal.Length = mean(Petal.Length))
select
和 group_by
与按值传递参数不同? select
打电话工作,将来会继续工作吗? group_by
电话打不通?我想弄清楚 quo()
的组合, enquo()
和 !!
我应该用它来让它工作。 我需要这个是因为我想创建一个将分组变量作为输入参数的函数,如果可能的话,分组变量应该作为字符串给出,因为另外两个函数参数已经作为字符串给出。
最佳答案
要将字符串作为符号或未计算的代码传递,您必须首先将其解析为符号或 quosure。您可以使用 sym
或 parse_expr
来自 rlang
解析并稍后使用 !!
取消引用:
library(dplyr)
variable <- rlang::sym("Species")
# variable <- rlang::parse_expr("Species")
iris %>%
group_by(!! variable) %>%
summarise(Petal.Length = mean(Petal.Length))
!!
是 UQ()
的快捷方式, 取消引用表达式或符号。这允许 variable
仅在调用它的范围内进行评估,即 group_by
.sym
之间的区别和 parse_expr
什么时候使用哪一个? 简短的回答:在这种情况下无关紧要。
长答案:
符号是引用 R 对象的一种方式,基本上是对象的“名称”。所以
sym
类似于 as.name
在基础 R。parse_expr
另一方面将一些文本转换为 R 表达式。这类似于 parse
在基础 R 中。表达式可以是任何 R 代码,而不仅仅是引用 R 对象的代码。所以你可以解析引用一个R对象的代码,但是你不能把一些随机代码变成
sym
如果它引用的对象不存在。一般来说,你会使用
sym
当您的字符串引用一个对象时(尽管 parse_expr
也可以使用),并使用 parse_expr
当您尝试解析任何其他 R 代码以进行进一步评估时。对于此特定用例,
variable
应该引用一个对象,因此将其转换为 sym
会工作。另一方面,将其解析为表达式也可以,因为这是将要在 group_by
中计算的代码。当被 !!
取消引用时.
关于r - Dplyr select 和 group_by 在引用变量方面的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45678466/