本小节主要介绍R语言关于 if,if else,ifelse,while,for,repeat语句的基础操作

一个小例子

{
 x<-15
 x
 }
 #R语言提供了分支、循环等程序控制结构
 #1.分支结构:if结构
 #if(条件)表达式1 或 if(条件)表达式1 else 表达式2 表达式可以是用大括号包围的复合表达式
 a <- 1
 if(a1) print("a1")
 a <- 1
 if(a1) print(a1) #不加双引号的结果
 a <- 2
 if(a > 1) print(“a > 1”) else print(“a <= 1”)
 a <- 3
 if( a == 1)
 {
 print(“a == 1”)
 }else # 注意这里,else必须紧跟在上一个大括号后面
 {
 print(“a != 1”)
 }

多重分支结构,同样每个else必须和前面的}紧紧粘在一起

a <- 4
 if( a == 1)
 {
 print(“a == 1”)
 }else if( a == 2)
 {
 print(“a == 2”)
 }else
 {
 print(“Not 1 & 2”)
 }

ifelse()计算第一个逻辑表达式得到结果如果为T则返回第二个参数;否则返回第三个参数

a <- 2
 print( ifelse(a > 1,3.1416,1.414) )
 a <- 2
 print( ifelse(a > 1,a+2,2*a) )
 #如果要计算x的重对数(对数的对数),必须要求x大于0,且log(x)也大于0
 x=10:20
 if(all(x>0)&&all(log(x)>0)) { #&&逻辑且运算,它是一个短路运算符,即第一 个条件为假时不计算第二个条件
 #||逻辑或运算,它是一个短路运算符,当第一个 条件为真时不计算第二个条件
 y=log(log(x));
 print(cbind(x,y));
 } else {
 print(“null”);
 }
x=0:10
 if(all(x>0)&&all(log(x)>0)) { #&&逻辑且运算,它是一个短路运算符,即第一 个条件为假时不计算第二个条件
 #||逻辑或运算,它是一个短路运算符,当第一个 条件为 真时不计算第二个条件
 y=log(log(x));
 print(cbind(x,y));
 } else {
 print(“null”);
 }x=1:10
 if(all(x>0)&&all(log(x)>0)) {y=log(log(x));
 print(cbind(x,y));
 } else {
 print(“null”);
 }

#2.for 循环结构

#R 语言有下面形式的for 循环架构 for (name in expr 1 ) expr 2
 #其中name 是循环变量,expr 1 是一个向量表达式(常常以1:20这种形式出现),而expr 2 常常是根据name 而设计的成组表达式。在name 访问expr 1 所有
 #可以取到的值时,expr 2 都会运行。
 for(i in 1:5) print(1234)
 for(i in 1:5) print(factorial(i) ) #求1到5的阶乘
 for(i in 1:5) print(i**2)
 for(j in 10:20) print(1:j)
 for(j in c(10,12,14,15,17,19)) print(1:j) #不规则的数用c连接起来
 #构造希伯特矩阵
 n<-4;x<-array(0,c(n,n)) #array数组,参数分别为数据集,行,列 只需更改n=4就可以很快构造五、六阶希伯特矩阵
 for(i in 1:n){
 for(j in 1:n){
 x[i,j]<-1/(i+j-1)}}
 x

#3.while循环
#while循环将一遍又一遍地执行相同的代码,直到满足停止条件。语法为:

while (test_expression) {

statement
}

while首先执行test_expression,如果为真,则执行statament,然后返回继续判断test_expression,直至为假停止执行

a <- c(“Hello”,“good bye”)
 b <- 2while (b < 7) {
 print(a)
 b <- b + 1
 }

repeat 循环

#Repeat循环重复执行相同的代码,直到满足停止条件。
 #在R中创建Repeat循环的基本语法是:repeat {

commands
if(condition) {

break
}
}
a <- c(“Hello”,“good bye”)
 b <- 2
 repeat {
 print(a)
 b <- b+1if(b >= 7) {       
   break
 }}


#练习:设计程序计算12+22+32+42+…+100^2 (用sum((1:100)^2)进行验证结果,此处要求编写循环语句)
#练习:分别用repeat、while、for语句输出所有不大于25且是5的倍数的正数
sum((1:100)**2)

达到同样的目的,运算效率却不同,可以采用system.time来输出运算时间

n=10000
 x=rep(0,n)
 system.time(for(i in 1:n) x[i]=i**2) #用户(user)时间和系统(system)的和表示执行计算任务所花费的CPU时间,运行(elapsed)时间包含执行与R当前任务无关的时间n=10000
 x=c()
 system.time(for(i in 1:n) x[i]=i**2)
#练习1:设计程序计算12+22+32+42+…+100^2
 n=100
 S=0
 for(i in 1:n) {
 S=S+i**2
 }
 S#练习2:分别用repeat、while、for语句输出所有不大于25且是5的倍数的正数
 i<-5
 repeat {
 print(i)
 i<-i+5
 if(i>25) {
 break
 }
 }i=5
 while(i<=25) {print(i);i=i+5}for(i in seq(5,25,5)) print(i)
#程序的效率(达到相同的效果,用的时间越短越有效)
 #要求输出1,2,3,…300
 #第一个程序
 n=300
 x=rep(0,n)
 for(i in 1:n) {
 x[i]=i
 }
 x
 #第二个程序n=300
 x=1
 for(i in 2:n) {
 x[i]=i
 }
 x#第三个程序
 n=300
 x=1:2
 for(i in 3:n) {
 x[i]=i
 }
 x#编写一个计算1000以内的Fibonacci(斐波那契)数列1,1,2,3,5,8,13,21,…
 f<-1;f[2]<-1;i<-1
 while (f[i]+f[i+1]<1000) {
 f[i+2]<-f[i]+f[i+1]
 i<-i+1;}
 fz<-1;z[2]<-1;i<-1
 repeat {
 z[i+2]<-z[i]+z[i+1]
 i<-i+1
 if (z[i]+z[i+1]>=1000) break}
 z