2017-08-14 70 views
6

在dplyr的当前版本,select参数可以按值传递:关于引用变量,select和group_by之间的Dplyr差异?

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)) 
  • 为什么selectgroup_by对于不同的,以按值传递参数呢?
  • 为什么第一个select电话正常工作,并将在未来继续工作?
  • 为什么第一个group_by调用不起作用?我试图找出quo()enquo()!!的什么组合,我应该用它来工作。

,我需要这个,因为我想创建一个函数,分组变量作为输入参数,如果可能的分组变量应该给出一个字符串,因为其他两个函数参数已经作为字符串给出。

+1

这不是努力的一部分[使用整齐的评估语义而不是标准评估](http://dplyr.tidyverse.org/reference/se-deprecated.html)? – Lyngbakr

+1

在'browseVignettes(package =“dplyr”)'中,您会发现一个关于编程的内容,涵盖了什么是/将会是惯用的。 – Frank

+0

几天前,我阅读了[编程中的dplyr小插图](https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html),现在阅读[rlang整理评估小贴士] (https://cran.r-project.org/web/packages/rlang/vignettes/tidy-evaluation.html)。 –

回答

2

要将字符串作为符号或未经评估的代码传递,您必须首先将其解析为符号或静默。可以使用symparse_exprrlang解析并在以后使用!!来解除引用:

library(dplyr) 

variable <- rlang::sym("Species") 
# variable <- rlang::parse_expr("Species") 

iris %>% 
    group_by(!! variable) %>% 
    summarise(Petal.Length = mean(Petal.Length)) 

!!UQ()快捷方式,其unquotes的表达或符号。这允许variable仅在被调用的范围内被评估,即group_by

+0

谢谢,使用'rlang :: sym'和'!!'我可以将分组变量作为字符串传递。 –

+1

我花了一段时间才明白为什么'!!'是必要的。 [整理评估报告](https://cran.r-project.org/web/packages/rlang/vignettes/tidy-evaluation.html)给出了一个帮助我理解的例子:“[...] quasiquotation:用户可以通过取消引用值来完全绕过符号评估,例如,以下表达式是完全等价的:#表达式:'dplyr :: mutate(mtcars,cyl2 = cyl * 2)'#取值:'var < - mtcars $ cyl * 2';'dplyr :: mutate(mtcars,cyl2 = !! var)“'。” –