R 程式設計/控制結構
外觀
< R 程式設計
- 程式設計幫助
> ?Control
if接受一維條件。
> if (condition){
+ statement
+ }
> else{
+ alternative
+ }
一維條件可以是以下之一:TRUE或者FALSE, T或者F, 1或者0或者使用真值運算子的語句
- x == y"x 等於 y"
- x != y"x 不等於 y"
- x > y"x 大於 y"
- x < y"x 小於 y"
- x <= y"x 小於或等於 y"
- x >= y"x 大於或等於 y"
並且可以使用&或者&&運算子表示 AND。|或者||是 OR 的運算子。
> if(TRUE){
+ print("This is true")
+ }
[1] "This is true"
> x <- 2 # x gets the value 2
> if(x==3){
+ print("This is true")
+ } else {
+ print("This is false")
+ }
[1] "This is false"
> y <- 4 # y gets the value 4
> if(x==2 && y>2){
+ print("x equals 2 and y is greater than 2")
+ }
[1] "x equals 2 and y is greater than 2"
該ifelse()命令以條件作為第一個引數,如果條件為真則以處理結果作為第二個引數,如果條件為假則以處理結果作為第三個引數。在這種情況下,條件可以是向量。例如,我們生成一個從 1 到 10 的序列,我們想要顯示小於 5 且大於 8 的值。
> x <- 1:10
> ifelse(x<5 | x>8, x, 0)
[1] 1 2 3 4 0 0 0 0 9 10
R 提供了一些非常有用的集合處理程式來選擇向量的一個子集
> x = runif(10)
> x<.5
[1] TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
> x
[1] 0.32664759 0.57826623 0.98171138 0.01718607 0.24564238 0.62190808 0.74839301
[8] 0.32957783 0.19302650 0.06013694
> x[x<.5]
[1] 0.32664759 0.01718607 0.24564238 0.32957783 0.19302650 0.06013694
排除向量的一個子集
> x = 1:10
> x
[1] 1 2 3 4 5 6 7 8 9 10
> x[-1:-5]
[1] 6 7 8 9 10

R 支援隱式迴圈,稱為向量化。這被內建到許多函式和標準運算子中。例如,+ 運算子可以新增兩個數字陣列,而無需顯式迴圈。
隱式迴圈通常很慢,最好在可能的情況下避免它們。
- apply()可以將函式應用於矩陣或陣列的元素。這可能是矩陣的行 (1) 或列 (2)。
- lapply()將函式應用於資料框的每一列,並返回一個列表。
- sapply()類似但輸出已簡化。它可能是一個向量或一個矩陣,具體取決於函式。
- tapply()為每個因素級別應用函式。
> N <- 10
> x1 <- rnorm(N)
> x2 <- rnorm(N) + x1 + 1
> male <- rbinom(N,1,.48)
> y <- 1 + x1 + x2 + male + rnorm(N)
> mydat <- data.frame(y,x1,x2,male)
> lapply(mydat,mean) # returns a list
$y
[1] 3.247
$x1
[1] 0.1415
$x2
[1] 1.29
$male
[1] 0.5
> sapply(mydat,mean) # returns a vector
y x1 x2 male
3.2468 0.1415 1.2900 0.5000
> apply(mydat,1,mean) # applies the function to each row
[1] 1.1654 2.8347 -0.9728 0.6512 -0.0696 3.9206 -0.2492 3.1060 2.0478 0.5116
> apply(mydat,2,mean) # applies the function to each column
y x1 x2 male
3.2468 0.1415 1.2900 0.5000
> tapply(mydat$y,mydat$male,mean) # applies the function to each level of the factor
0 1
1.040 5.454
- 另請參閱aggregate()與tapply()類似,但應用於資料框而不是向量。
R 提供三種編寫迴圈的方法:for、repeat 和 while。這for語句非常簡單。您只需要定義索引(此處為 k)和一個向量(在下面的示例中,向量為 1:5),然後指定您想要在括號之間執行的操作。
> for (k in 1:5){
+ print(k)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
當無法使用 for 語句時,您還可以透過指定中斷規則來使用 break 或 while。應該謹慎使用這種迴圈,因為如果中斷規則指定錯誤,迴圈將永遠不會結束。在下面的兩個示例中,只要值低於 1,就會繪製標準正態分佈。cat() 函式用於在螢幕上顯示當前值。
> repeat {
+ g <- rnorm(1)
+ if (g > 1.0) break
+ cat(g,"\n")
+ }
-1.214395
0.6393124
0.05505484
-1.217408
> g <- 0
> while (g < 1){
+ g <- rnorm(1)
+ cat(g,"\n")
+ }
-0.08111594
0.1732847
-0.2428368
0.3359238
-0.2080000
0.05458533
0.2627001
1.009195
next 語句可用於中止一個特定的迴圈並跳到“下一個”。
> for (k in 1:10) {
+ if(k==8) {
+ print("skipped")
+ next
+ }
+ print(k)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] "skipped"
[1] 9
[1] 10
- R 中的迴圈通常很慢。迭代器可能比迴圈更有效。請參閱 Revolution Computing 部落格 中的此條目
