當我們希望能寫出一個幫助我們「判定」事情的程式碼,來進一步決定後續的步驟及得到最終結果,這時「流程控制」就派上用場啦!
布林運算元
我們在程式碼中寫的 Claim (如 2 > 5、1 = 10),布林運算元會幫助我們做邏輯判斷,看看這些 Claims 究竟是真的(true)還是假的(false),也就是「會回傳 TRUE / FALSE」的運算元,比如 2 > 5 就會回傳 false,但如果是 8 > 5 則回傳 true。如果是 true,才會執行後續的程式碼;如果回傳 false,就會跳過之後的程式碼、不會執行它,也就是流程控制中,布林運算元回傳 true 才會打開、false 就會關起來。
在 R 裡常見的布林運算元:
<(小於某數值,例如:4 < 5)vs>(大於某數值,例如:3 > 2)<=vs>=(大或小於等於某數值,例如:3 >= 3)==vs!=: 等於 / 不等於(判斷左右兩邊的數值 / 字串是一樣還是不一樣的。運算的等於符號會是以兩個等於符號來表示精準等於的意思,如:100 == 100。若是單一個等於符號 (例如:100 = 100),程式會將右邊的 100 分配 (Assign) 給左邊的 100,這樣就會產生語法錯誤)
> 2 > 5
[1] FALSE
> 8 > 5
[1] TRUE
「且」 (AND) 與 「或」(OR) 的運算元
在做流程控制時,如果希望 (1) 滿足多個條件、(2) 只要滿足多個條件的其中一個,這時我們需要用 AND 與 OR 來串聯不同的布林運算式。R 比較特別的是,會有 Elementwise 做元素個別的比較,或是 Lazy 全部比較完看滿不滿足來決定 TRUE / FALSE。
在 R 裡, AND 有兩種寫法:
&:每一個元素個別比較&&:所有的元素都會一起比較,只要有一個不滿足就會輸出 FALSE,全都滿足才會回傳 TRUE

[1] 0.7933944 -0.4689827 -0.2557522 0.1457067 0.8164156 -0.5966361
[7] 0.7967794 0.8893505
我們可以看到已經產生了從八個從 -0.5966361 到 0.8893505 的八個隨機亂數,全部的值都介於 -1 到 1 之間

[1] TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
如果我們想看哪幾個數值同時滿足「x 大於等於 0」與「x 小於等於 0.8」,也就是介於 0 – 0.8 之間的數值,程式就會幫我們去比較每一個元素、並把比較的結果輸出成向量,讓我們對照結果,比如說第一、四、七個數值是符合條件的

[1] "lovely" "-0.4689826737158" "-0.25575220072642"
[4] "lovely" "0.816415579989552" "-0.596636137925088"
[7] "lovely" "0.889350537210703"
我們還可以透過條件設定,把符合條件的元素篩選出來,指派給它新的值

[1] FALSE
接下來是 OR 的兩種類型:
|:每一個元素個別比較||:只要有一個滿足就會輸出 TRUE

[1] FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE
再次隨機產生八個 -1 到 1 之間的亂數,想要找出大於等於 0.4 或小於等於 -0.4 的數值,發現第三、四、五、八個數值是符合條件的

[1] FALSE
如果用 Lazy 的 OR 去做,因為沒有全都滿足條件 TRUE,所以輸出 FALSE

[1] "0.321595584973693" "0.258228087797761" "lovely"
[4] "lovely" "lovely" "0.374045693315566"
[7] "-0.231792563572526" "lovely"
同樣可以用 OR 的方式指派滿足特定條件的元素新的數值或字串
流程控制的重點:條件執行
R 最重要的條件執行方式 ➫ if(), else if(), else:標準的條件執行方法,括號裡面是我們想要判斷的布林運算值,「如果(…){執行片段}」、「不然的話,如果(…){執行片段}」、「不然的話{執行片段}」if() ➫ 如果 () 裡的布林運算值是true,我們就要執行裡面的片段else if() ➫ 如果 if() 裡的布林運算值是 false,改為執行這裡面的片段else ➫ 如果以上都不滿足,再執行這裡面的片段

[1] 0
因為 x 是 5、比 7 小,所以 y 就被指派成 0,最後 output 出來就是 0
ifelse(): 與 EXCEL 中的 if 函數用法一致

[1] 0
跟上面例子一樣,因為 x 是 5、比 7 小,所以最後 y 回傳 0
switch(): 執行指定名稱的程式片段
switch 括號裡的第一個位置放的是我們給定的值,而 switch 會把給定值去跟後方的 case 們做比對,並回傳比對到符合的 case 要操作的結果

[1] 4
給定 Dereck 這個字串,當 switch 比對到 Dereck 這個 case,就會回傳 1+ 3 = 4
附上手邊的幾個部落格和線上課程網址:
- Hahow 好學校 – R語言和商業分析-洞悉商業世界中的資料科學 [寫這些學習筆記歷程最主要的來源之一]
http://tinyurl.com/y2hhr3vf - 資料科學與R語言 [曾意儒老師 Yi-Ju Tseng]
https://yijutseng.github.io/DataScienceRBook/index.html - 統計計算與程式語言 [林建甫老師]
https://web.ntpu.edu.tw/~cflin/ - 認識 R 的美好 [郭耀仁老師]
https://bookdown.org/tonykuoyj/eloquentr/ - R系列筆記 [skydome20 老師]
https://rpubs.com/skydome20/Table