R 跟一般的程式語言一樣有許多流程控制與迴圈的語法,讓程式依照設計者的邏輯逐步執行對應的動作。
有時候在處理資料時,我們會希望程式依照某些條件來判斷應該要執行什麼動作,而不是很單純的將指令逐行執行,R 提供了許多流程控制的語法,可藉由指定的條件來判斷程式執行的流程。
if
與 else
判斷式if
判斷式是最簡單、也是最常被使用一種條件判斷語法,他可以判斷一個輸入的邏輯值,如果輸入的值為 TRUE
,則執行對應的程式碼,反之該值若為 FALSE
,則不執行:
if(TRUE) message("It was true!")
It was true!
if(FALSE) message("It wasn't true!")
通常我們會使用 if
來判斷指定的變數或是運算式,依據該變數或運算結果來決定是否執行後續的動作:
bool.val <- runif(1) > 0.5 if (bool.val) message("Bingo!");
Bingo!
這裡我們使用 runif
函數產生一個 unifrom 分配的隨機變數,若其值大於 0.5
則輸出一行訊息。也可以把兩行合併,這樣可讓程式碼更簡潔:
if (runif(1) > 0.5) message("Bingo!");
Bingo!
如果要讓 if
為 TRUE
之後,可以執行多行指令,就要使用大括號將要執行的程式區塊包起來:
if (runif(1) > 0.5) { message("Bingo!"); message("Ha!"); }
當判斷式之後的程式碼只有一行時,可將大括號省略,但在撰寫 R 的指令稿時,為了讓程式碼更容易被閱讀,建議可以將大括號都保留下來。
if
判斷式只會在條件判別為 TRUE
時執行對應的程式,若要在條件判斷為 FALSE
時也可以執行另一個動作,可以加上 else
判斷式:
if (runif(1) > 0.5) { message("Bingo!"); } else { message("Fail!"); }
Fail!
在使用 else
時要注意一點,他必須跟 if
的結尾大括號放在同一行,如果寫成這樣就會造成程式解析上的錯誤:
if (runif(1) > 0.5) { message("Bingo!"); } else { message("Fail!"); }
如果需要判斷多重的條件,可以將 if
與 else
重複配合使用:
x <- runif(1) if (x > 0.75) { message("Perfect!"); } else if (x > 0.5) { message("Good!"); } else if (x > 0.25) { message("Bad!"); } else { message("Worst!"); }
Perfect!
下面這個是一個 if
與 else
的簡潔寫法範例:
sample <- if(runif(1) > 0.5) "Good" else "Bad" sample
[1] "Bad"
這裡的 sample
有一半的機率會是 "Good"
,另一半的機率會是 "Bad"
。
if
如果遇到缺失值時,會產生錯誤:
if(NA) message("Who knows if it was true?")
Error in if (NA) message("Who knows if it was true?") : 需要 TRUE/FALSE 值的地方有缺值
如果要處理缺失值,可以配合 is.na
來使用:
if(is.na(NA)) message("The value is missing!")
The value is missing!