高級編程--控制結構
當R解釋器運行代碼時,它按順序逐行讀取。如果一行不是一個完整的語句,它會讀取附加行直到可以構造一個完全的語句。例如,如果你想計算3+2+5的和,可以運行代碼:
3 + 2 + 5
也可以運行下列代碼:
3 + 2 +
5
#第一行末尾的+號表示語句不是完整的。
你想有條件的或是重復地執行一個或多個語句很多次。這一部分描述了三個控制流函數,這幾個函數在書寫函數中是十分有用的:for()、if()和ifelse()。
1. for循環
for()函數允許你重復執行語句。語法是:
for(var in seq){
statements
}
其中var是一個變量名,seq是計算向量的表達式。如果僅有一個語句,那么花括號是可省略的:
for(i in 1:5) print(1:i)
for(i in 5:1)print(1:i)
# var直到函數退出才退出。退出時,i為1。
2. if()和else
if()函數允許你有條件地執行語句。if()結構的語法是:
if(condition){
statements
} else {
statements
}
運行的條件是一元邏輯向量(TRUE或FALSE)並且不能有缺失(NA)。else部分是可選的。如果僅有一個語句,花括號也是可以省略的。
下面的代碼片段是一個例子:
x<-c(1,3,5,7,8)
y<-c(20,23,37,48,59)
if(interactive()){
plot(x, y)
} else {
png("myplot.png")
plot(x, y)
dev.off()
}
如果代碼交互運行,interactive()函數返回TRUE,同時輸出一個曲線圖。否則,曲線圖被存在磁盤里。
3. ifelse()
ifelse()是函數if()的量化版本。矢量化允許一個函數來處理沒有明確循環的對象。ifelse()的格式是:
ifelse(test, yes, no)
其中test是已強制為邏輯模式的對象,yes返回test元素為真時的值,no返回test元素為假時的值。
比如你有一個p值向量,是從包含六個統計檢驗的統計分析中提取出來的,並且你想要標記p<0.05水平下的顯著性檢驗。可以使用下面的代碼:
pvalues <- c(.0867, .0018, .0054, .1572, .0183, .5386)
results <- ifelse(pvalues <.05, "Significant", "Not Significant")
results
同樣的結果可以使用顯式循環完成,很明顯向量化的版本更快且更有效:
pvalues <- c(.0867, .0018, .0054, .1572, .0183, .5386)
results <- vector(mode="character", length=length(pvalues))
for(i in 1:length(pvalues)){
if (pvalues[i] < .05) results[i] <- "Significant"
else results[i] <- "Not Significant"
}