20151005 [Coursera] R Programming (7)

整理自 R Programming (Week 2) -- Control Structures

[ Week 2 課程內容 ]
 
 
[ 筆記內容 ] 
 
 
[ 補充資料 ]
 
 
 
 

< 控制結構 > Introduction

[ 參考資料 ]
 
 
[ 重點整理 ] 常用的結構
  • If、else
  • 常用在執行具有特定條件的程式。
  • for  
  • for迴圈,常用來執行特定次數的程式。
  • while
  • while迴圈,當條件符合時就會執行指定的程式。
  • repeat
  • 無限迴圈
  • break
  • 可以跳脫任意迴圈
  • next
  • 跳過某一次的迴圈。
  • return
  • 退出副程式(函數)。
 
 
 
 

(一)If-else

[ 參考資料 ]
 
 
[ 重點整理 ]
  • 用法1 : 當情況符合 condition_1 時,執行 A;否則將執行 B。
  • < 用法1 >
if(condition_1) {
 ## do A
} else {
 ## do B
}
 
  • 用法2 : 當情況符合 condition_1 時,執行 A;或者假如符合condition_2,執行 B;否則將執行 C。
  • < 用法2 >
if(condition_1) {
 ## do A
} else if(condition_2) {
 ## do B
} else {
 ## do C
}
 
 
[ 操作範例 ] 利用 if-else 指定y值
  • 如果 x > 3 ,y 就等於 3;否則 y 就等於 0。
  • < 標準結構 >
if(x > 3) {
 y <- 10
} else {
 y <- 0
}
 
  • < 簡潔寫法 >
y <- if(x > 3) {
 10
} else {
 0
}
 
 
 
 

(二)For loops

[ 參考資料 ]
 
 
[ 重點整理 ]
  • 當 for 迴圈符合條件時,就會依據其指定變數的次數來重複執行迴圈內的程式,直到程式執行完其指定的次數。
for(i in 1:10) {    # 執行的次數;i 從 1 執行到 10 ,總計 10 次。
 print(i)           # 在每一次執行 for迴圈 時都會列印變數 i 的值。
}
 
  • 以下 for 迴圈 用法皆具有相同意義:
  • < 用法1 >  最常見的用法
x <- c("a", "b", "c", "d")
for(i in 1:4) {
 print(x[i])
}
 
  • < 用法2 >  使用 seq_aloong()
  • seq_along() 的輸入為一個向量,其輸出為與向量等長的整數數列。
x <- c("a", "b", "c", "d")
for(i in seq_along(x)) {
 print(x[i])
}
  •  
  • < 用法3 >  從向量中直接取值
  • 使用 letter變數 直接從向量中取值。
x <- c("a", "b", "c", "d")
for(letter in x) {
 print(letter)    
}
  •  
  • < 用法4 >  for 迴圈的單行用法
x <- c("a", "b", "c", "d")
for(i in 1:4) print(x[i])
 
  • < 用法5 > 巢狀(多重) for 迴圈
  • 盡量避免超過 2 個以上的多重迴圈,會讓程式很難看得懂。
# 列印二維矩陣
x <- matrix(1:6, 2, 3)    
for(i in seq_len(nrow(x))) {       
    for(j in seq_len(ncol(x))) {    
    print(x[i, j])                  
    }
}
 
 
 
 

(三)While loops

[ 參考資料 ]
 
 
[ 重點整理 ]
  • 當 while 迴圈符合條件時,就會執行迴圈內的程式,每一次執行迴圈時都會再檢查一次迴圈是否符合條件。
  • < 用法1 >  最常見的用法
# 每次進入迴圈前會判斷"count是否小於10",如果符合就會一直執行迴圈內的程式。
count <- 0
while(count < 10) {    
 print(count)
 count <- count + 1
}
 
  • < 用法2 >  具有多個以上的條件以及多種情況
  • rbinom(n, size, prob)
  • n >> number of experiments
  • size >> number of observations per experiment
  • prob >> probability of success
z <- 5
while(z >= 3 && z <= 10) {        # 當 z大於等於3 以及 z小於等於10
    print(z)
    
    coin <- rbinom(1, 1, 0.5)    
    if(coin == 1) {     
        z <- z + 1
    } else {
        z <- z - 1
    }
}
 
 
 
 
[ 參考資料 ]
 
 
[ 重點整理 ]
1.  Repeat
  • Repeat 迴圈是一個無窮迴圈,可以使用 "break" 指令跳脫。
x0 <- 1
tol <- 1e-8    # 10的-8次方
repeat {
    x1 <- computeEstimate()
    if(abs(x1 - x0) < tol) {
        break    # 跳脫"repeat"迴圈
    } else {
        x0 <- x1
    }
} 
 
 
2.  Next、Return
  • Next 指令用來跳過這一次的迴圈,直接執行下一次;Return 指令則用在當副程式執行完時,用來回傳執行結果。
# i <= 20,都不會執行"程式碼A"
for(i in 1:100) {
    if(i <= 20) {    # 跳過前20次的迴圈執行
        next    # 先跳脫這一次執行的迴圈,直接執行下一次
    }
    # 程式碼A
}