1.if 语句
1.1 if语句的基本格式
if(逻辑表达式)
{
系列运算命令
}
如果if语句所执行的命令只有一行时可以省略大括号
eg1:假设1度电费是50元,为了鼓励节约资源,如果一个月使用超过200度,电费将再加收总价的15%,如果电费小于1元,以四舍五入处理。
myfunction1<-function(deg,price=50)
{energyPrice=deg*price
if(deg>200)
energyPrice=energyPrice*1.15
return(round(energyPrice))
}
> myfunction1(202)
[1] 11615
[1] 11615
1.2 if... else 语句
if ...else 语句的基本格式:
if (逻辑表达式)
{系列运算命令符A
}else{
系列运算命令符B
}
eg2:延续实例1,但条件改为,如果用电度数在100(含)度以下,则电费享受八五折,100度以上电费增加15%。
myfunction2<-function(deg,price=50)
{
energyPrice=deg*price
if(deg<=100)
energyPrice=energyPrice*0.85
else
energyPrice=energyPrice*1.15
return(round(energyPrice))
}
> myfunction2(150)
[1] 8625
[1] 8625
1.3 if 语句也可以有返回值
R语言和其他高级语言不通,它的if语句类似函数也可以有返回值,可以将该返回值赋予给其他变量。
1.4 if ...else if...else if...else
if (逻辑表达式A)
{
系列运算命令A
}else if(逻辑运算B)
{
系列运算B
...
}else if(逻辑表达式n)
{
系列运算n
}else
{
系列其他运算命令
}
eg3:接实例1,条件改为:如果一个月用电超过120度。则电费加收总价的15%,如果一个月用电低于80度,则电费可以减免15%。
myfunction3<-function(deg,price=50)
{
energyPrice=deg*price
if(deg>120)
energyPrice=energyPrice*1.15
else if(deg<80)
energyPrice=energyPrice*0.85
else
energyPrice=energyPrice
return(round(energyPrice))
}
{
energyPrice=deg*price
if(deg>120)
energyPrice=energyPrice*1.15
else if(deg<80)
energyPrice=energyPrice*0.85
else
energyPrice=energyPrice
return(round(energyPrice))
}
> myfunction3(70) [1] 2975 > myfunction3(100) [1] 5000 > myfunction3(150) [1] 8625
1.5 嵌套式if 语句
嵌套式if语句指的是if语句内可以包含其他的if语句。
eg4.假设电费是1度电费50元,为了鼓励节约资源,如果一个月用电低于(含)100度,电费可减免15%,
同时如果一个家庭有贫困证明,电费可再减免三成;如果电费超过100度,将加收总价的15%。
myfunction4<-function(deg,price=50,poor=FALSE)
{
energyprice<-deg*price
if(deg>100)
energyprice=energyprice*1.15
else
if(poor==TRUE)
energyprice=energyprice*0.85*0.7
else
energyprice=energyprice*0.85
return(round(energyprice))
}
> myfunction4(80,poor=TRUE)
[1] 2380
myfunction4<-function(deg,price=50,poor=FALSE)
{
energyprice<-deg*price
if(deg>100)
energyprice=energyprice*1.15
else
if(poor==TRUE)
energyprice=energyprice*0.85*0.7
else
energyprice=energyprice*0.85
return(round(energyprice))
}
> myfunction4(80,poor=TRUE)
[1] 2380
2.递归式函数的设计
递归式函数指的是一个函数调用自己,这个函数被称为递归式函数。递归式函数具有如下特点:
1)递归式函数每次调用自己时,都会使问题越来越小。
2)必须有一个终止条件来终止递归函数的运行。
设计递归式函数时,很容易使程序调入无限循环的过程中,一定要特别小心。
eg4:设计阶乘函数。
myfunction4<-function(x)
{if(x==0)
x_sum=1
else
x_sum=x*myfunction4(x-1)
return(x_sum)
}
{if(x==0)
x_sum=1
else
x_sum=x*myfunction4(x-1)
return(x_sum)
}
> myfunction4(3) [1] 6
3.向量化的逻辑表达式
处理向量数据时,if ..else会报错。对于向量数据,我们可以使用ifelse()函数,其基本格式如下:
ifelse(逻辑判断,TRUE表达式,FALSE表达式)
如果逻辑判断为TRUE,则执行TRUE表达式;否则执行FALSE表达式。
eg5:ifelse(c(1,5)>3,10,1)
[1] 1,10
4.Switch语句
payattention:switch语句无法处理向量数据。其基本格式如下:
switch(判断运算,表达式1,表达式2,...)
判断运算的最终值可能是数字或文字,如果最终值是1,则执行表达式1,如果最终值是2,则执行表达式2,以此类推。
eg6:依据输入的字符串,作出相应的响应。输入"iphone"则返回"Apple";输入"TV",则返回"Sony";输入"PC",则返回"Dell".
myfunction6<-function(type)
{
switch(type,iphone="Apple",
TV="Sony",
PC="Dell"
}
>myfunction6("TV"
)
[1] "Sony"
5.for 循环
for循环可以用于向量对象的操作,它的使用格式如下:
for(循环索引 in 区间){
系列运算命令
}
eg7:计算1到n的总和。
myfunction7<-function(n)
{
sum=0
for(i in 1:n)
sum=sum+i
return(sum)
}
{
sum=0
for(i in 1:n)
sum=sum+i
return(sum)
}
> myfunction7(100)
[1] 5050
[1] 5050
6.while 循环
while循环的使用格式如下:
while(逻辑表达式){
系列运算命令
}
如果逻辑表达式为TRUE,循环将持续执行,知道逻辑表达式为FALSE。
eg8:使用while循环计算1到n的总和。
myfunction8<-function(n){
sum=0
while((n>=0){
sum=sum+n
n=n-1}
return(sum)
}
7.repeat 循环
repeat循环的使用格式如下:
repeat{
单一或系列运算命令
if(逻辑表达式)break
其他运算命令
}
如果if的逻辑表达式为TRUE,则执行break,跳出repeat循环。
eg9:使用repeat循环计算1到n的总和。
myfunction9<-function(x){
sum=0
repeat{
sum=sum+x
if(x==0) break
x=x-1
}
return(sum)
}
8.break语句
执行break时,可立即跳出循环
9.next 语句
next语句和break语句一样,需要与if语句,也就是逻辑表达式配合使用,但是next语句会跳过目前这次循环的剩下命令,直接进入下一个循环。
eg10:计算1到n之间偶数的总和。
myfunction10<-function(x){
sum=0
for(i in 1:n){
if(i %%2!=0)next
sum=sum+i
}
print(sum)
}