5 資料的工作流

5.1 %>% 運算子

在 R 語言中我們使用 %>% 運算子建立資料的工作流(The workflow of data),稱作為 Forward Pipe,使用之前,必須要安裝和載入 magrittr 這個套件:

# 安裝 magrittr 套件 ---------
install.packages("magrittr")
# 載入 magrittr 套件 ---------
library(magrittr)

我們傳統呼叫函數的習慣是將輸入(inputs)放置在函數名稱的小括號中;但是在使用 %>% 運算子的時候,我們將輸入放置在 %>% 運算子的左邊,並且將函數放置在 %>% 運算子的右邊,看起來就像是把輸入丟入函數中的樣子:

abs(-5:5) # 傳統
-5:5 %>% abs() # Foreward Pipe

%>% 運算子是 R 語言將物件導向編程(Object Oriented Programming)中的 鏈結方法(Chaining Methods)過渡到函數編程(Functional Programming)的重要因子,當我們需要不停地將前一個函數的輸出作為下一個函數的輸入時,就是 %>% 運算子上場的適當時機!

請考慮以下這個例子:

假設我們現在有一個需求是把系統日期的年份擷取出來,並且轉換為數字,我們可能會這樣寫:

sys_date <- Sys.Date()
sys_date_yr <- format(sys_date, format = "%Y")
sys_date_num <- as.numeric(sys_date_yr)
sys_date_num
## [1] 2018

這樣寫的可讀性(Readibility)很高,但是為了得到我們要的答案,過程中額外建立了 sys_datesys_date_yr 這兩個物件,好像不是太有效率,那麼我們試著把上面這段程式改寫得精簡一點:

sys_date_num <- as.numeric(format(Sys.Date(), format = "%Y"))
sys_date_num
## [1] 2018

這樣寫雖然精簡,但是可讀性就變得比較低,尤其是小括號很多,我們都不喜歡去檢查哪個左括號應該對應哪個右括號。在這種呼叫多次函數,並且需要將前一次函數的輸出作為後一次函數的輸入時,就應該想到使用 %>%

library(magrittr)

sys_date_num <- Sys.Date() %>%
   format(format = "%Y") %>%
   as.numeric()
sys_date_num
## [1] 2018

這樣的寫法就兼顧了可讀性高與精簡的兩個優點!