Day 20- R語言 流程控制-if, ifelse, switch
哎呀呀,繪圖的部分好像有點寫太多了,所以今天學流程控制好了。如果有機會再回去學ggplot跟使用R 應用其他統計學的概念。
感覺流程控制真的還蠻重要的,因為前幾天都有想要寫流程控制相關的程式卻因為不太會寫所以先暫時放棄…(是說,我把流程控制留到這麼後面是不是欠打啊…)
雖然之前有學到apply函數,網路上也說過用R寫程式語言不要用for迴圈(因為效率低?),不過我想還是學一下下怎麼寫會比較好,實際應用時再來斟酌使用apply家族函數或for迴圈
流程控制主要的用處就是讓程式走分支(循序),根據不同的條件(選擇)輸出不同的結果,在必要時,也可以讓程式重複執行(重複),直到得到結果為止。
那進入正題吧,R的流程控制結構大致上有五大種:if
, ifelse
, switch
, for
, while
. 今天我會把重點放在if
, ifelse
, 和switch
。
1. if…else流程控制:If … else的流程控制類型是選擇,代表意義為「如果…然後」
假設今天要寫一套考試成績通過與否的if … else流程控制,成績等於或高於60分為通過,輸出文字為: 「通過!祝你有美好的寒/暑假!」,若低於或等於59分則為不通過,輸出文字為:「未通過!明年見!」,我寫的程式碼如下:
寫只有一層的if…else流程控制時,
testscore <- sample(1:100, 1)
if (testscore >= 60){
message("Pass!Have a nice summer/winter break!")
} else {
message("Fail! See you next year!")
}
但是今天要將學生成績分組,輸出不同結果時,可以使用多個if...else 組合。若輸入高於90分,程式輸出「完美!」,輸入高於六十分,結果為「不錯!」,輸入高於四十分,程式輸出「不好喔!」,低於40分則輸出「糟透了!」
testscore <- sample(1:100, 1)
if (testscore > 90) {
message("Perfect!");
} else if (testscore > 60)
{
message("Good!");
} else if (testscore > 40)
{
message("Bad!");
} else
{
message("Worst!");
}
多層else if程式碼要注意的是,大括弧的位置不能放錯,不然會造成程式判斷錯誤
2. ifelse 流程控制ifelse
算是簡化版的if...else
,流程控制類型一樣是選擇,代表意義也是「如果…然後」,ifelse
流程控制寫法為:ifelse(條件, yes敘述, no敘述)
再用剛剛的成績計算為例,如果今天單純想知道考試成績是否高於60分,可以用ifelse(testscore > 60, "yes", "no")
表示,這邊的 “yes”, “no”
可以換成其他敘述,像是 “pass”, “fail”等文字。
另外,條件部分可以包含另外一個函數。如果testscore
變數有六個資料 (testscore <- sample(1:100, 6))
,而且想檢驗六比成績資料平均是否達到60分,可以這樣寫:ifelse(mean(testscore) > 60, "pass", "fail")
3. Switch流程控制
剛剛有提到如果要寫多個條件判斷時可以使用else if堆疊,但是用太多else if的話,程式碼就會顯得很雜亂,做後續維護也會稍稍麻煩。因此,可以用switch
來做與else if差不多的事情。
Switch 的流程控制類型是選擇,可以處理多重條件判斷。Switch的寫法為:
Switch(指定程式碼行數/名稱,
(第一行程式碼/名稱)程式/指令
(第二行程式碼/名稱)程式/指令
(第三行程式碼/名稱)程式/指令
…
)
例:
switch(6, #指定程式行數
1+1, #第一行
2+2, #第二行
3+3, #第三行
4+4, #第四行
5+4, #第五行
10) #第六行
輸出結果為10
明天繼續寫for還有while的流程控制
參考資料: