控制流

一:条件指令

指令switch()

使用方式如下:

switch(<expr:test>,<expr:case1>=<code1>,<expr:case2>=<code2>,...)
在上面的指令中,表达式<expr:test>要么是一个数要么是个字符串。如果<expe:test>等于
<expr:case1>,该指令输出<code1>;如果<expe:test>等于<expr:case2>,该指令输出<code2>;
以此类推,如果<expe:test>不等于<expr:casei>中的任何一个,函数switch()会输出NULL。

>  x<-rcauchy(10)  #产生10个来自Cauchy分布的随机数。
> my.input<-"mean"
> switch(my.input,mean=mean(x),median=median(x))
[1] 7.13925
> my.input<-"median"
> switch(my.input,mean=mean(x),median=median(x))
[1] -0.5766231
> my.input<-"variance"
> switch(my.input,mean=mean(x),median=median(x))
> my.input
[1] "variance"

> switch(EXPR ="b",a=4,b=2:3,"else:nothing")
[1] 2 3
> switch(EXPR="QQ",a=4,b=2:3,"else:nothing")
[1] "else:nothing"

指令if和else

条件指令if以如下两种方式被调用:

if(<cond>)<expr:true>
或
if(<cond>){<expr:true>} else{<expr:false>}
参变量<cond>必须是一个逻辑值,因此只能去TRUE和FALSE中的一个。
注意,<cond>先要被as.logical(<cond>)转换为逻辑值,而且实数(0是唯一被转换为FLASE的实数)
和字符串(“T”或“TRUE"和”F"或“FASLE")都是允许的取值,同时要注意<cond>的长度必须为1,(长度为1的意思
应该是<cond>中的表达式只能有一个)
否则只有<cond>的第一个元素会被考虑,同时R会显示一条警告信息!
。
> if(TRUE)1+1
[1] 2
> x<-2
> y<--3
> if(x<=y){z<-y-x
+ print("x smaller than y")
+ }else{
+     z<-x-y
+     print("x larger than y")
+     z
+ }
[1] "x larger than y"
[1] 5

首选的逻辑运算符

为了更好的使用逻辑运算符,建议使用;

x&&y而不是x&y

x||y而不是x|y

如果使用&&,将从左至右逐项评估if后的逻辑条件,直到一个FLASE被发现为止。这样使得代码的运行的速度可以更快

同样使用||,将从左至右逐项评估if后的的逻辑条件,直到一个TRUE被发现为止。因此应当坚持使用这种长形。

 

if()指令中函数all.equal()的用法

在使用if()指令的时候,应当:

使用isTRUE(all.equal(x,y))而不是x==y

使用!isTRUE(all.equal(x,y))而不是x!=y

> x<-0.1
> y<-0.1
> x==y
[1] TRUE
> x<-0.2-0.1
> y<-0.3-0.2
> x==y
[1] FALSE
> all.equal(x,y,tolerance=10^-6)   #tolerance,用来指定容许偏差极限(tolerance limit),
两个值之间的差若低于该值则被当做0来处理。
[1] TRUE

二;循环指令(loop)

循环也是一种控制结构,它允许在一行中一部分代码被多次执行,直到一个退出条件被满足或者达到了事先指定的循环次数才会中止运行。

在R中有三种循环指令;for,while和repeat。此外,保留字next和break能对代码的执行给出额外的控制。指令break会立即跳出当前的循环,指令next将程序的执行返回到循环的起点,使得循环的下一次迭代(如果存在的话)开始执行,而对当前的迭代,next后的指令不会在执行。

指令for

该指令的语法形式如下:

for(i in vector)<statements>
> for(i in 1:3)print(i)
[1] 1
[1] 2
[1] 3
> x<-c(1,3,7,2)
> for(var in x)print(2*var)
[1] 2
[1] 6
[1] 14
[1] 4

指令while

该指令的语法格式如下:
while(<condition>)<expression>
例如:
> x<-2
> y<-1
> while(x+y<7)x<-x+y
> x
[1] 6

指令next和break

> for(i in 1:4){
+     if(i==3) break
+     for(j in 6:8){
+         if(j==7) next 
+         j<-i+j
+     }
+ }
> 
> i
[1] 3
> j
[1] 10

指令repeat 和break

> i<-0
> repeat{
+     i<-i+1
+     if(i==4) break
+ }
> i
[1] 4

除此之外,诸如apply(),tapply(),和sapply(),等函数给出一种更为隐晦但常常十分有用的方式来使用循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值