R语言编程结构-循环结构

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

你可能感兴趣的:(R语言)