iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 6
1
Big Data

R語言與機器學習見面會系列 第 6

Day06 R語言的流程控制(ifelse)

習成了30天見面會第一個主題R:語言環境操作,接著我們要航向R語言的偉大航道了!
30天見面會R語言第二個主題:R語言基礎。

在資料庫知識探索(KDD)中,收集完成的觀測數據要成為可以被探勘的資料集(dataset)前,通常會先經過清理及轉換等幾個流程,這部分也通常最費工,而流程控制的基本組成元素就是判斷式及迴圈,兩種流程控制在各程式語言都有,我們來試試R語言的!

條件式判斷


條件式是我們在電腦程式中指引程式方向要用的句型,實際執行時,電腦會根據運算式的 Boolean(True/False) 值決定要執行的陳述式。

我們在專案程式館新增一個資料夾MyR,然後新增一支Day06.R

http://ithelp.ithome.com.tw/upload/images/20161206/20103434UGPqPQ9mJh.png

if語法


程式規格:
將吹東風後的訊號指派(<-)給x,此時使用if語法,程式判斷若x等於吹東風就通知: 啟稟丞相!起風了。

在Day06.R中輸入程式碼

#if 
x <- "吹東風" 
if (x == "吹東風") { 
    cat(x, "啟稟丞相!起風了", "\r\n") 
    cat("快!通知江東!") 
} 

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161206/20103434BrmtyqRdxx.png

#help(cat) = Concatenate and print(函數:字串連結並且列印到Console)

if else語法


程式規格:
丞相把是否派馬謖駐守街亭的決定指派(<-)給x,此時使用if else語法,程式若判斷x == TRUE就列印"馬謖守街亭,注意水源!",反之就列印"魏延守街亭"

#if else 
x <- TRUE 
if (x) { 
    cat(x, "馬謖守街亭,注意水源") 
} else { 
    cat(x, "魏延守街亭,妥當!") 
} 

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161206/20103434NyHnHylwvY.png

這邊我們先複習幾個R語言的語法重點

  • R語言是case sentive,也就是要分大小寫,TRUEFALSE都是大寫!
  • else一定要和前一句的}寫在同一行,如果沒有,我們會得到以下的紅字!

http://ithelp.ithome.com.tw/upload/images/20161206/20103434ij6vtQFKeo.png

  • if-else 不加{}了話,需要一鏡到底(一行程式碼)寫完
  • 換行符號與其他程式語言相同(\r\n)
  • 雖然=<-同義,但R Manual建議的指派運算子是 <-,可以在任何地方使用。

巢狀if


程式規格:
丞相將領軍進攻南蠻的任務人選指派x,使用if語法,判斷若x若等於1就列印"關羽",依此類推1,2,3,4,若都不等於1,2,3,4,則派常山趙子龍。

在Day06.R中輸入程式碼

#nested if else 
x <- sample(1:5, size = 1) 
if (x == 1) { 
    cat(x, "遣關羽") 
} else if (x == 2) { 
    cat(x, "遣張飛") 
} else if (x == 3) { 
    cat(x, "遣馬超") 
} else if (x == 4) { 
    cat(x, "遣黃忠") 
} else { 
    cat(x, "遣趙雲") 
} 

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161206/201034344Bvo32yokt.png

#help(sample) = Random Samples and Permutations (函數:亂數取數,暫時我們先不設定亂數種子,預設是時間。)

Switch


那麼有沒有比較好閱讀的switch?
有的!但閱讀起來需要轉一下。

在Day06.R中輸入程式碼

x <- sample(1:5, size = 1) 
y <- switch( 
   EXPR = x, 
   "1" = "遣關羽",  
   "2" = "遣張飛", 
   "3" = "遣馬超", 
   "4" = "遣黃忠", 
   "遣趙雲") 
cat(x, y) 

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161206/20103434bDUefb6hsQ.png

邏輯運算子


如果有多個條件式,可以用以下兩種運算子串接
&&: AND
||: OR

ifesle語法糖


語法句型: ifelse(test, yes, no)

ifelse(x >= 1, "晚安!我要下去領500了", "繼續努力po文")

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161206/20103434jQ21hWg8dj.png

是不是和C# ?:運算子類似。

進階一點還有stopifnottryCatch,今天我們先複習簡單的判斷式,有機會再到R Manual試試進階!


參考:

R-Manaul相關連結:
switch
http://stat.ethz.ch/R-manual/R-patched/library/base/html/switch.html

stopifnot
http://stat.ethz.ch/R-manual/R-patched/library/base/html/stopifnot.html

trycatch
http://stat.ethz.ch/R-manual/R-patched/library/base/html/conditions.html

ifelse
http://stat.ethz.ch/R-manual/R-patched/library/base/html/ifelse.html


航向偉大航道
http://ithelp.ithome.com.tw/upload/images/20170116/20103434UEHKq4JoQA.jpg

2014-10攝於Lisboa,Portugal


上一篇
Day05 R語言的套件安裝
下一篇
Day07 R語言的流程控制(loop)
系列文
R語言與機器學習見面會30

尚未有邦友留言

立即登入留言