R语言编程基础(1)

本小节主要介绍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 <- 2

while (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+1

 if(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;}
f

z<-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

猜你喜欢

转载自blog.csdn.net/weixin_44723899/article/details/88654471