3 控制流程
3.1 條件判斷
3.1.1 if-else敘述
if-else敘述使用在邏輯判斷,若需要依條件改變需要執行的程式碼,就會使用if-else,若if後所接邏輯判斷為真(TRUE),就會執行if下方之程式碼,若為偽(FALSE),則執行else下方之程式碼,若程式中沒有else片段,則不執行任何程式碼。
if
與else
下方的程式碼必須要使用{}
將程式碼包起來,若程式碼只有一行,可省略{}
,但為閱讀方便,建議不要省略{}
。
舉例來說,若考試分數大於等於60分,則印出及格字樣,小於60分則印出不及格字樣,程式範例如下:
## [1] "不及格"
## [1] "及格"
3.1.2 if-else if-else
很多時候必須要使用多重邏輯判斷,若考試分數大於等於90分,印出優良,介於60到90分間,印出及格,小於60分則印出不及格,此時就會用到多重邏輯,使用多重邏輯時,會在if
和else
間新增邏輯區段else if,程式範例如下:
## [1] "優秀"
if-else if-else
敘述是有順序的,若在if
敘述判斷為真,就算後方else if
判斷也為真,也只會執行if
區段的程式碼,如上述範例,95分大於等於90分(if邏輯),也大於等於60分(else if邏輯),但最後只印出優秀字樣。
###巢狀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] "國文及格,英文再加油"
###ifelse()
ifelse()
函數可用最短的方式取代if-else
敘述,使用方法為ifelse(邏輯判斷,判斷為真要執行的程式碼,判斷為偽要執行的程式碼)
,依上述範例,重寫程式碼如下:
## [1] "及格"
值得注意的是,ifelse()
可判斷向量,也就是可一次判斷多個元素
## [1] "不及格" "及格" "不及格" "及格" "及格"
##迴圈
###for
R語言的for
迴圈寫法和其他語言不同,首先必須建立需要逐一執行的參數向量或序列,再使用for
迴圈逐一執行,程式寫法為for (單一變數 in 參數向量){ 程式碼 }
,範例如下:
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
for
迴圈也可和if-else
函數合併使用,如:
## [1] "奇數"
## [1] 2
## [1] "奇數"
## [1] 4
## [1] "奇數"
## [1] 6
## [1] "奇數"
## [1] 8
## [1] "奇數"
## [1] 10
###while
while
函數則是在每次執行迴圈時檢查while邏輯判斷是否為真,若邏輯判斷為真,就會執行區段程式碼,若邏輯判斷為偽,則會結束迴圈執行。
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
###break
若遇特殊情形想結束迴圈執行,可使用break
指令
## [1] 1
## [1] 2
## [1] 3
## [1] 4
###next
若遇特殊情形想跳過迴圈執行,可使用next
指令
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
##purrr better than sapply() and lapply()