R 跟一般的程式語言一樣有許多流程控制與迴圈的語法,讓程式依照設計者的邏輯逐步執行對應的動作。

流程控制

有時候在處理資料時,我們會希望程式依照某些條件來判斷應該要執行什麼動作,而不是很單純的將指令逐行執行,R 提供了許多流程控制的語法,可藉由指定的條件來判斷程式執行的流程。

ifelse 判斷式

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!

如果要讓 ifTRUE 之後,可以執行多行指令,就要使用大括號將要執行的程式區塊包起來:

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!");
}

如果需要判斷多重的條件,可以將 ifelse 重複配合使用:

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!

下面這個是一個 ifelse 的簡潔寫法範例:

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!