2017-08-14 57 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)「'。」 –