參考資料:學習R
? ? ? ? 在R中有三種循環:repeat、while和for。雖然向量化意味著我們可能并不需要大量使用它們,但在需要重復執行代碼時,它們是非常有用的。
1、重復循環
? ? ? ? R中最容易掌握的循環是repeat。它所做的事情就是反復地執行代碼,直到告訴它停為止。下面這個代碼將反復執行,直到我們按下escape鍵、退出R為止。
repeat{message("Happy Groundhog Day!")
}
? ? ? ? 一般來說無限循環不是我們想要的,因此需要一個break語句來跳出無限循環。下例中,sample函數將在每個循環迭代中返回一個操作:
repeat{message("Happy Groundhog Day!")action<-sample(c("Learn French","Make an ice status","Rob a bank","Win heart of Andie McDowell"),1)message("action= ", action)if(action=="Win heart of Andie McDowell") break
}
????????
? ? ? ? 有時候,我們想做的不是退出整個循環,而是跳出當前的迭代,開始next一下次迭代而已:
repeat{message("Happy groundhog Day")action<-sample(c("Learn French","Make an ice statue","Rob a bank","Win heart of Andie McDowell"),1)if(action=="Rob a bank"){message("Quietly skipping to the next iteration")next}message("action= ",action)if(action=="Win heart of Andie McDowell") break
}
2、while循環
? ? ? ? while循環就像是延遲了的repeat循環。它不是先執行代碼再檢查循環是否應該結束,而是先進行檢查再執行代碼。因為檢查發生在開始時,所以循環體可能不會被執行。如下:
action<-sample(c("Learn French","Make an ice statue","Rob a bank","Win heart of Andie McDowell"),1
)
while(action!="Win heart of Andie McDowell"){message("Happy Groundhog Day!")action<-sample(c("Learn French","Make an ice statue","Rob a bank","Win heart of Andie McDowell"),1)message("action= ",action)
}
3、for循環
? ? ? ? 這種循環適用于已知代碼所需執行的循環次數的情形。for循環將接受一個迭代器變量和一個向量參數。在每個循環中,迭代器變量會從向量中取得一個值。最簡單的情況下,該向量只包含整數:
for(i in 1:5) message("i= ",i)
? ? ? ? 如果我們想執行多個表達式,與其他循環一樣,須使用大括號把他們括起來:
for(i in 1:5){j<-i^2message("j= ",j)
}
? ? ? ? R的for循環非常靈活,因為它們的輸入并不限于整數或數字,還可以傳入字符向量、邏輯向量或列表:
for (month in month.name){message("The month of ",month)
}for(yn in c(TRUE,FALSE,NA)){message("This statement is ",yn)
}
l<-list(pi,LETTERS[1:5],charToRaw("not as complicated as it looks"),list(TRUE)
)
for (i in l){print(i)
}
? ? ? ? 因為for循環操作于向量中的每個元素,所以它提供了一種“偽向量化”。注意,R的for循環幾乎總是比其對應的向量化運行得要慢,而且往往是一到兩個數量級的差別。這意味著我們應盡可能地使用向量化。