R語言進階 | 非標準計算tidyeval
接著上一篇R語言進階 | 非標準計算base,本篇講tidyeval。
在tidyverse工具鏈中,tidyeval提供比較一致的非標準計算服務。tidyeval的函數主要在rlang包中。rlang非標準計算函數比較多,目前坑還沒有踩完。這裡只分享目前自己在數據分析中最常用的函數組合。
parse_expr+eval_tidy
parse_expr把字元轉成表達式,然後用eval_tidy進行求值。
parse_exprs是parse_expr的加強版,可以處理多個字元串。
在eval_tidy函數之外,還有輕量級的eval,就是eval_bare。兩個函數差別不大,eval_bare不能接收數據,eval_tidy可以接收數據。
eval_bare(expr, env = parent.frame())neval_tidy(expr, data = NULL, env = caller_env())n
如果求值的時候不涉及到新的數據,而是像"mean(mtcars$wt)",那麼就可以用eval_bare。具體如下。
如果需要用到數據,那麼則需要用eval_tidy進行求值。
quo/enquo+!!
這個主要是為了方便傳遞表達式,更好地寫函數。
比如,有一個場景:給一個數據集df,對指定變數a進行分組,然後對指定變數b進行求均值。如果這個場景只是出現一次,那麼寫幾行命令實現一下需求就跳過去了。
如果在分析中多次遇到這一場景,那麼這個時候最好的辦法就是寫一個group_mean函數,在需要的時候就可以直接調用,簡潔,易讀,減少代碼的複製粘貼。
!!是表示立即對表達式求值,與quo搭配使用。使用rlang非標準計算涉及到=時需要寫成:=。
在調用group_mean時還需要寫quo,這個看起來還是比較麻煩,不夠簡潔。可不可以把這個工作也放在函數定義中去?
這個時候需要用到enquo函數。具體如下。
此時,調用group_mean是不是更便捷?
參考資料
Programming with dplyr
Tidy evaluation
dplyr 0.7.0
推薦閱讀:
※簡明數據科學 Part1:原理與過程
※機器學習很枯燥,不想繼續學了怎麼辦?或許,這些建議值得一看
※數據科學,機器學習和人工智慧有什麼區別?