R 語言流程控制

當我們希望能寫出一個幫助我們「判定」事情的程式碼,來進一步決定後續的步驟及得到最終結果,這時「流程控制」就派上用場啦!

布林運算元

我們在程式碼中寫的 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


附上手邊的幾個部落格和線上課程網址:

Leave a Reply

Your email address will not be published. Required fields are marked *