在当前版本的 dplyr 中,select
参数可以按值传递:
variable <- "Species"
iris %>%
select(variable)
# Species
#1 setosa
#2 setosa
#3 setosa
#4 setosa
#5 setosa
#6 setosa
#...
But 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
The 记录 dplyr::select 行为 https://www.rdocumentation.org/packages/dplyr/versions/0.7.2/topics/select is
iris %>% select(Species)
并且有记录的记录 dplyr::group_by 行为 https://www.rdocumentation.org/packages/dplyr/versions/0.7.2/topics/group_by is
iris %>%
group_by(Species) %>%
summarise(Petal.Length = mean(Petal.Length))
- Why are
select
and group_by
与按值传递参数不同?
- 为什么是第一个
select
调用工作并且它将来会继续工作吗?
- 为什么是第一个
group_by
打电话不通?我想弄清楚什么组合quo()
, enquo()
and !!
我应该用它来让它发挥作用。
我需要这个,因为我想创建一个将分组变量作为输入参数的函数,如果可能的话,分组变量应该以字符串形式给出,因为另外两个函数参数已经以字符串形式给出。
要将字符串作为符号或未计算的代码传递,您必须首先将其解析为符号或quosure。您可以使用sym
or parse_expr
from 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
and parse_expr
以及何时使用哪一个?
简短的回答:在这种情况下并不重要。
长答案:
符号是引用 R 对象的一种方式,基本上是对象的“名称”。所以sym
类似于as.name
在基础 R 中。parse_expr
另一方面将一些文本转换为 R 表达式。这类似于parse
在基础 R 中。
表达式可以是anyR 代码,不是just引用 R 对象的代码。所以你可以解析code引用 R 对象,但你不能将一些随机代码变成sym
如果它引用的对象不存在。
一般来说,您将使用sym
当你的字符串引用一个对象时(尽管parse_expr
也可以),并使用parse_expr
当你试图解析时any其他 R 代码以供进一步评估。
对于这个特定的用例,variable
应该引用一个对象,所以把它变成一个sym
会工作。另一方面,将其解析为表达式也可以工作,因为这是code将在内部进行评估group_by
当被取消引用时!!
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)