高级编程--控制结构
当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"
}