2017-06-20 93 views
0

我有一個我寫的函數,它應該過濾一些值,然後生成一個交叉表。它使用dplyr過濾器過濾值,選擇命令。將列名傳遞給使用dplyr函數的書面函數

我的問題是,當我傳遞函數列的名稱時出現錯誤,並且當我以字符串的形式傳遞名稱作爲字符串時,它不會過濾觀察值。 下面是代碼:

​​
+1

建議的重複:[dplyr變量與變量列名稱](https://stackoverflow.com/q/26003574/903061) – Gregor

+1

還請注意''dplyr'來[用dplyr編程一個小插曲]( H ttps://cran.r-project.org/web/packages/dplyr/vignettes/programming.html),其中詳細介紹瞭如何做到這一點。 – Gregor

回答

2

隨着dplyr(0.7)的最新版本,你可以做這樣的事情

library(dplyr) 

fnDoCrosstab <- function(a) { 
    a <- enquo(a) 
    x <- mtcars %>% filter((!!a) != 0) %>% select(mpg, !!a) %>% as.vector() 
    x 
} 
fnDoCrosstab(am) 
fnDoCrosstab(vs) 

您與enquo()捕捉未計算的字段名稱,然後展開,作爲需要與!!

+0

工作正常!雖然我不知道爲什麼。 'enquo()'實際上做了什麼?什麼是'!!'操作符? – Corel

+0

有'dplyr'(更具體地說''rlang')引入的所有新東西。要了解如何使用它們,請閱讀[用dplyr小插曲編程](https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html) – MrFlick