3 控制流程

3.1 條件判斷

3.1.1 if-else敘述

if-else敘述使用在邏輯判斷,若需要依條件改變需要執行的程式碼,就會使用if-else,若if後所接邏輯判斷為真(TRUE),就會執行if下方之程式碼,若為偽(FALSE),則執行else下方之程式碼,若程式中沒有else片段,則不執行任何程式碼。

ifelse下方的程式碼必須要使用{}將程式碼包起來,若程式碼只有一行,可省略{},但為閱讀方便,建議不要省略{}

舉例來說,若考試分數大於等於60分,則印出及格字樣,小於60分則印出不及格字樣,程式範例如下:

score<-59
if(score>=60){
  print("及格")
}else{
  print("不及格")
}
## [1] "不及格"
score<-80
if(score>=60){
  print("及格")
}else{
  print("不及格")
}
## [1] "及格"

3.1.2 if-else if-else

很多時候必須要使用多重邏輯判斷,若考試分數大於等於90分,印出優良,介於60到90分間,印出及格,小於60分則印出不及格,此時就會用到多重邏輯,使用多重邏輯時,會在ifelse間新增邏輯區段else if,程式範例如下:

score<-95
if(score>=90){
  print("優秀")
}else if(score>=60){
  print("及格")
}else{
  print("不及格")
}
## [1] "優秀"

if-else if-else敘述是有順序的,若在if敘述判斷為真,就算後方else if判斷也為真,也只會執行if區段的程式碼,如上述範例,95分大於等於90分(if邏輯),也大於等於60分(else if邏輯),但最後只印出優秀字樣。

3.1.3 巢狀if

巢狀if是指在if區段程式碼內包含其他if-else判斷,舉例來說,若國文分數與英文分數皆大於等於60分,印出全部及格,國文分數大於等於60分,英文小於60分,則印國文及格,英文再加油,以此類推,程式範例如下:

CHscore<-95 ##國文成績
ENscore<-55 ##英文成績
if(CHscore>=60){
  if(ENscore>=60){
    print("全部及格")
  }else{
    print("國文及格,英文再加油")
  }
}else{
  if(ENscore>=60){
    print("英文及格,國文再加油")
  }else{
    print("全部不及格")
  }
}
## [1] "國文及格,英文再加油"

3.1.4 ifelse()

ifelse()函數可用最短的方式取代if-else敘述,使用方法為ifelse(邏輯判斷,判斷為真要執行的程式碼,判斷為偽要執行的程式碼),依上述範例,重寫程式碼如下:

score<-80
ifelse(score>=60,"及格","不及格")
## [1] "及格"

值得注意的是,ifelse()可判斷向量,也就是可一次判斷多個元素

scoreVector<-c(30,90,50,60,80)
ifelse(scoreVector>=60,"及格", "不及格")
## [1] "不及格" "及格"   "不及格" "及格"   "及格"

3.2 迴圈

3.2.1 for

R語言的for迴圈寫法和其他語言不同,首先必須建立需要逐一執行的參數向量或序列,再使用for迴圈逐一執行,程式寫法為for (單一變數 in 參數向量){ 程式碼 },範例如下:

for (n in 1:10){ #n為單一變數,1:10為需要逐一執行的參數向量
  print(n)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10

for迴圈也可和if-else函數合併使用,如:

for (n in 1:10){
  if(n%%2==0){ #偶數直接輸出數字
    print(n)
  }else{
    print("奇數") #奇數則輸出"奇數"
  }
}
## [1] "奇數"
## [1] 2
## [1] "奇數"
## [1] 4
## [1] "奇數"
## [1] 6
## [1] "奇數"
## [1] 8
## [1] "奇數"
## [1] 10

3.2.2 while

while函數則是在每次執行迴圈時檢查while邏輯判斷是否為真,若邏輯判斷為真,就會執行區段程式碼,若邏輯判斷為偽,則會結束迴圈執行。

x<-0
while(x<=5){
  print(x)
  x<-x+1
}
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

3.2.3 break

若遇特殊情形想結束迴圈執行,可使用break指令

for(n in 1:10){
  if(n==5){
    break ##一執行到5,跳出迴圈,不再執行之後的迴圈
  }
  print(n)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4

3.3 purrr

better than sapply() and lapply()