R 學習日誌#5 - 程式的邏輯與迴圈結構

判斷

分為邏輯判斷以及條件判斷。

邏輯判斷

大於、等於、小於、大於等於、小於等於、不等於

1
2
3
4
5
6
7
8
9
10
11
12
13
> x <- 20
> x > 20
[1] FALSE
> x == 20
[1] TRUE
> x < 20
[1] FALSE
> x >= 20
[1] TRUE
> x <= 20
[1] TRUE
> x != 20
[1] FALSE

條件判斷

1
2
3
4
5
6
7
> x <- 20
> if (x == 20) print ("x == 20")
[1] "x == 20"

> if (x > 15) print ("x > 15") else print ("x <= 15 ")
[1] "x > 15"

switch 語句的判斷結構

1
2
3
4
5
6
7
8
> y <- 3
> switch(y,
+ print("a"),
+ print("b"),
+ print("c"),
+ print("d")
+ )
[1] "c"

函數

自定義與使用函數,以下這個例子是不用傳入參數,只要呼叫 fnTest() ,就會執行方法。

1
2
3
4
5
> fnTest <- function() {
+ print("噗噗。故我在")
+ }
> fnTest()
[1] "噗噗。故我在"

接著再做一個有放參數的方法,當傳入參數 x 與 y 之後,將由 x 到 y 做加總(當然 x 必須要小於 y 了,這樣才能執行迴圈,否則 x>y 的話,預設會為 0),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
> fnTest2 <- function(x, y) {
+ sum <- 0
+ if (x < y) {
+ for (i in x:y) {
+ sum <- sum + i
+ }
+ }
+ return(sum);
+ }
> fnTest2(2, 8)
[1] 35
> fnTest2(12, 8)
[1] 0

迴圈

for 迴圈

透過 x:y 產生數值 x 到 y 的向量,再利用迴圈做循環以 cat 函數將字串顯示出來。

1
2
3
4
5
6
7
8
> for (i in 1:5) {
+ cat("num:", i, "\n")
+ }
num: 1
num: 2
num: 3
num: 4
num: 5

while 迴圈

while 迴圈是除了 for 迴圈另外一種迴圈了,差異在於 while 是透過邏輯判斷進行迴圈,for 則是定義了有限的變數或向量物件來作迴圈,以下方的例子就是若判斷超過 10 的話,那麼就會跳出迴圈,跳出之後就不會再做任何的計算,是個相當容易閱讀的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> x <- 1
> while (x <= 10) {
+ print(x)
+ x <- x + 1
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

repeat

repeatwhile 相似,但是 repeat 的特性就是以無限迴圈開始建構的,除非有做判斷,否則都是繼續執行下去。以下的例子就是 y 的變數是從 1 加到 50,而 x 在 51 時跳出 (break) 迴圈。

1
2
3
4
5
6
7
8
9
10
11
> x <- 1
> y <- 0
> repeat {
+ if (x > 50) break;
+ y <- x + y
+ x <- x + 1
+ }
> x
[1] 51
> y
[1] 1275

break 表示跳出迴圈,相反的 next 則是跳出迴圈的某一個循環

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> x <- sample(1: 10)
> x
[1] 4 7 10 9 2 5 6 8 3 1
> for (i in x) {
+ if (i > 4) {
+ print("the number > 4")
+ next;
+ }
+ print(i)
+ }
[1] 4
[1] "the number > 4"
[1] "the number > 4"
[1] "the number > 4"
[1] 2
[1] "the number > 4"
[1] "the number > 4"
[1] "the number > 4"
[1] 3
[1] 1