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:原理與過程
機器學習很枯燥,不想繼續學了怎麼辦?或許,這些建議值得一看
數據科學,機器學習和人工智慧有什麼區別?

TAG:R编程语言 | 数据科学 | 元编程 |