R语言编程结构
1 控制语句
1.1 循环语句
x<-c(5,12,13)
for(n in x) print(n^2)
## [1] 25
## [1] 144
## [1] 169
i<-1
while(i<=10) i<-i+4
i
## [1] 13
i<-1
while(TRUE){#similar loop to above
i<-i+4
if(i>10) break
}
i
## [1] 13
i<-1
repeat{ # again similar
i<-i+4
if(i>10) break
}
i
## [1] 13
另外一个重要的语句是next,它会告诉解释器跳过本次迭代的剩余部分,直接进入循环的下一次迭代。这避免了使用复杂的if-then-else嵌套结构,不致让代码混乱不清。
sim<-function(nreps){
commdata<-list()
commdata$countabsamecomm<-0
for(rep in 1:nreps){
commdata$whoselft<-1:20
commdata$numabchosen<-0
if(commdata$numabchosen>0) next
commdata<-choosencomm(commdata,4)
if(commdata$numabchosen>0) next
commdata<-choosencomm(commdata,3)
}
print(commdata$countabsmaecomm/nreps)
}
setwd("E:\\学习\\学习\\R语言\\R语言编程艺术\\书中程序\\第7章")
for(fn in c("file1.txt","file2.txt")) print(scan(fn))
## [1] 1 2 3 4 5 6
## [1] 5 12 13
1.2 对非向量集合的循环
R并不支持对非向量集合的循环,但是有一些间接但简单的方法可以做到这点:
1.使用lapply()。如果循环的每次迭代之间相互独立,就使用lapply()。可以允许以任意顺序执行。
2.使用get()。正如名字暗示的一样,这个函数接受一个代表对象名字的字符串参数,然后返回改对象的名字。
来看一个使用get()的例子,例如有两个包含了统计数据的矩阵u和v ,我们希望对每一个矩阵执行线性回归函数lm()。
(u<-matrix(c(1,2,3,1,2,4),nrow=3))
## [,1] [,2]
## [1,] 1 1
## [2,] 2 2
## [3,] 3 4
(v<-matrix(c(8,12,20,15,10,2),nrow=3))
## [,1] [,2]
## [1,] 8 15
## [2,] 12 10
## [3,] 20 2
for(m in c("u","v")){
z<-get(m)
print(lm(z[,2]~z[,1]))
}
##
## Call:
## lm(formula = z[, 2] ~ z[, 1])
##
## Coefficients:
## (Intercept) z[, 1]
## -0.667 1.500
##
##
## Call:
## lm(formula = z[, 2] ~ z[, 1])
##
## Coefficients:
## (Intercept) z[, 1]
## 23.29 -1.07
1.3 if-else结构
x<-2
y<-if(x==2) x else x+1
y
## [1] 2
x<-3
y<-if(x==2) x else x+1
y
## [1] 4