20151211 [R基礎與應用] Ch10:迴圈 - 疊代元素的傳統作法

整理自 R 軟體資料分析基礎與應用 -- Ch10 : 迴圈 - 疊代元素的傳統作法

[ 筆記內容 ]
  • (一)for 迴圈
  • [ 範例 1 ] 顯示 " 1 到 10 "
  • [ 範例 2 ] 利用疊代和向量化計算將工作簡化
  • (二)while 迴圈
  • [ 範例 ] 顯示 " 1 到 5 "
  • (三)迴圈的強制處理:"next" 和 "break"
  • [ 範例 1 ] "next (跳過此次疊代)" 的應用 (使用 for 迴圈)
  • [ 範例 2 ] "break (退出迴圈)" 的應用 (使用 for 迴圈)
 
 
 
 

(一)for 迴圈

  • "for 迴圈" 所需要的引數可被分為三個部份:
  • 第一部份:"變數" << 被指派於第三部份裡的每一個值
  • 第二部份:"in" << 表示 "變數 (第一部分)" (in) "vector (第三部份)"
  • 第三部份:"含有任何值的 vector" << 一般為 "numeric (數值)" "character (字元)"
# "for 迴圈"使用範例
for (i in 1:10)    # "i" -> "變數" ; "1:10" -> "含有任何值的 vector"
{
    # ... (要執行的工作)
}
 
  • [ 範例 1 ] 顯示 " 1 到 10 "
> # 方法1:建立含有數字"1 ~ 10"的 vector,然後用"for 迴圈"逐一顯示
> for (i in 1:10)
+ {
+     print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
>
> # 方法2:使用內建的向量化運算,再搭配"print"函數顯示 
> print(1:10)
 [1]  1  2  3  4  5  6  7  8  9 10
  • < 執行結果 >
 
 
  • [ 範例 2 ] 利用疊代和向量化計算將工作簡化
> # 建立一個含有水果名稱的 vector
> fruit <- c("apple", "banana", "pomegranate")
> # 建立一個變數(亦為 vector)以儲存水果名稱的長度,先儲存"NA"值作為開始
> fruitLength <- rep(NA, length(fruit))
> # 把它顯示出來,全部為"NA"值
> fruitLength
[1] NA NA NA
> # 替它取名
> names(fruitLength) <- fruit
> # 再次顯示,還是"NA"值
> fruitLength
      apple      banana pomegranate 
         NA          NA          NA 
> # 對 fruit(水果名稱)做出疊代,每次把名稱長度都存入 vector 裡
> for (a in fruit)
+ {
+     fruitLength[a] <- nchar(a)
+ }
> # 把長度顯示出來
> fruitLength
      apple      banana pomegranate 
          5           6          11 
>
> # 呼叫 nchar 函數
> fruitLength2 <- nchar(fruit)
> # 替它取名
> names(fruitLength2) <- fruit
> # 顯示出來
> fruitLength2
      apple      banana pomegranate 
          5           6          11 
> identical(fruitLength, fruitLength2)
[1] TRUE
  • < 執行結果 >
 
 
 
 

(二)while 迴圈

  • "while 迴圈" 只要符合 "檢測的條件" ,就會重複執行 "大括號 { } " 裡的所有指令:
# "while 迴圈"使用範例
while (x <= 10)    # "x <= 10" -> "檢測的條件"
{
    # ... (要執行的工作)
}
 
  • [ 範例 ] 顯示 " 1 到 5 "
> x <- 1
> while (x <= 5)
+ {
+     print(x)
+     x <- x + 1
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
  • < 執行結果 >
 
 
 
 

(三)迴圈的強制處理:"next" 和 "break"

  •  "next"(跳過此次疊代) "break"(退出迴圈) 之間的差異:
 
  • [ 範例 1 ] "next (跳過此次疊代)" 的應用 (使用 for 迴圈)
> for (i in 1:10)
+ {
+     if (i == 3)    
+     {
+         next    # 當 i = 3 時,會跳過此次疊代 (在結果中"3"並沒有被顯示出來)
+     }
+     print(i)
+ }
[1] 1
[1] 2
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
  • < 執行結果 >
 
 
  • [ 範例 2 ] "break (退出迴圈)" 的應用 (使用 for 迴圈)
> for (i in 1:10)
+ {
+     if (i == 4)
+     {
+         break    # 當 i = 4 時,會退出迴圈 (在結果中只顯示"1 ~ 3",其他數字並不會被顯示)
+     }
+     print(i)
+ }
[1] 1
[1] 2
[1] 3
  • < 執行結果 >
  • 當 i = 4 時,會退出迴圈:在結果中"4"以後的數字並不會被顯示 ( 包括數字"4"本身)