R语言入门4---R语言流程控制

​ 流程控制语句在任何语言中都是非常重要的,通过流程控制语句编程者能够根据业务逻辑在程序中设计合理的循环、分支,实现程序各种各样强大的功能。一般实现任一算法的控制结构都可以分为顺序结构、分支结构、循环结构及其混合。在R语言中,流程控制语句主要有if elseforwhileswitchrepeat等,这些流程控制语句本身在许多语言中都是相似的,最重要的是注意其在不同语言中的语法特性。

顺序结构

​ 所谓顺序结构,即是实现一个算法或者一个功能,要先做什么,再做什么一条条依次从上到下写下来,这是算法实现的基本结构。分支、循环结构中也往往包含顺序结构;顺序结构中往往也可能由一系列分支、循环结构构成。

​ 比如,我要实现一个功能:寻找三个数的最大值,那么假设我们三个数分别是 a, b, c ,那么我们是不是可以一个个依次去比较,最后得出最大值:如果a<b, 那么就让a=b, 这样a就是 a、b中更大的了;接着,如果a>c, 那么a就是三个数的最大值,返回结果;如果a<c,则c是三个数的最大值,返回结果c的值。这整一个实现,就是一个顺序结构。(Ps. 但是整个顺序结构又会由几个分支结构组成,分支结构我们下面讨论)

ThreeMax<-function(a, b, c)
{
  if(a<b){
    a = b
  }
  if(a>c){
    return (a);
  }
  else{
    return (c);
  }
}

d <- ThreeMax(5,6,3)
# [1] 6

分支结构

​ 顾名思义,所谓分支结构就是程序在处理不同情况采取不同的措施的一种结构。比如,上面例子中的如果a>c,则返回a;反之,返回c,这就是一种分支结构。在R语言中,实现分支结构有关键字switchif elsestopifnot

if else

if else在上面的例子中也已经有体现了,其使用方式为:if (条件) 表达式1 else if(条件) 表达式2 else 表达式3,其中条件的值应该是一个标量的真或假值;表达式则是在对应条件下的逻辑代码。不妨,再举个例子,如身高高于180为tall,165-180为middle,低于165为short,则实现代码如下:

height = 187

if(height>=180){
    cat("Tall\n")
} else if(height <165){
    cat("Short\n")
} else{
    cat("Middle\n")
}
# Tall

​ 另外值得关注的是函数ifelse(),它可以根据一个逻辑向量中的多个条件, 分别选择不同结果,如:

x <- c(-2, 0, 1)
y <- ifelse(x >=0, 1, 0); print(y)

# 0 1 1

switch

​ switch在R语言中是以switch(EXPR, ...)函数来实现的,这一点和比如C++将switch作为关键字实现不太一样,但是做的事情都是一样,即根据EXPR的值决定所做的操作,我们可以看个例子:

ccc <- c("b","QQ","a","A","bb")
# note: cat() produces no output for NULL
for(ch in ccc)
    cat(ch,":", switch(EXPR = ch, a = 1, b = 2:3), "\n")
# 输出
b : 2 3 
QQ : 
a : 1 
A : 
bb : 

for(ch in ccc)
    cat(ch,":", switch(EXPR = ch, a =, A = 1, b = 2:3, "Otherwise: last"),"\n")

b : 2 3 
QQ : Otherwise: last 
a : 1 
A : 1 
bb : Otherwise: last 

​ 即根据EXPR的值,去寻找后面属性有没有与之相匹配的属性,如果有则做相应属性所对应的操作并返回值;反正返回缺省值(如上例中的"Otherwise: last")

循环结构

​ 循环结构功能非常强大,比如我们要找任意个数的最大值,那么我们就需要用到循环结构。在R语言中,循环结构主要包括forwhilerepeat三个关键字,以下是三个循环关键字的功能比较:

循环类型和描述
repeat循环多次执行一系列语句,并简化管理循环变量的代码。
while循环在给定条件为真时,重复语句或语句组。 它在执行循环体之前测试条件。
for循环像while语句,不同之处在于它测试在循环体的端部的条件。

for

for循环功能强大,可以对向量每个元素、矩阵每行、矩阵每列进行循环处理,基本使用方法是:for(循环变量 in 序列) 语句 ,假设我们要循环处理一个向量,如果向量元素大于0,我们标记1;向量元素小于0,我们就标记0:

x <- rnorm(5)
y <- numeric(length(x))
for(i in 1:5){
  if(x[i]>=0) y[i] <- 1 else y[i] <- 0
}
print(y)

​ 其中rnorm(5)会生成5个标准正态分布随机数。 numeric(n)生成有n个0的数值型向量(基础类型为double)。如果想对一个向量的下标进行循环,我们可以借助seq()函数来完成,同上例我们可以这样写:

x <- rnorm(5)
y <- numeric(length(x))
for(i in seq(along.with=x)){
  if(x[i]>=0) y[i] <- 1 else y[i] <- 0
}
print(y)

while

​ 实际上while语句和for语句非常相似,基本使用模式为:while(循环条件) 语句 ,当循环条件满足时,则执行语句,否则退出循环,我们不妨用while来实现以下上面的例子:

x <- rnorm(5)
y <- numeric(length(x))
i = 1
n = length(x)
while(i<=n){
  if(x[i]>=0) y[i] <- 1 else y[i] <- 0;
  i = i+1;
}
print(y)

repeat

repeat循环称为无条件循环其循环体内的代码段的执行,一般配合if语句跳出循环,在R语言中escape 循环有两个关键字,分别是next (相当于C语言中的continue,跳过循环的当前迭代而不终止循环) 和 break (终止循环跳出循环体)。我们先for循环解释一下这两个关键字:

for(i in 1:10){ 
  if(i=5){
      break; 
  }
  print(i);
}
# 只会输出 1-4

for(i in 1:10){ 
  if(i=5){
      next; 
  }
  print(i);
}
# 除了4,其他都会输出

​ 我们在回到repeat本身,我们可以利用它来计算整数前100之和,实现代码如下:

i = 1
sum = 0
repeat{
  sum = sum + i;
  i = i + 1;
  if(i==100) break;
}
print(sum)

# 4950

写在篇尾

​ okay,R语言流程控制的主要内容就是这些啦,总体来说很简单,但是也很重要,只有掌握这些基本的流程控制语句你才可能会编程。更多R语言相关文章:

R语言入门1—R语言介绍以及学前注意事项

R语言入门2—R语言基础绘图

R语言入门3—R语言六大基本数据结构

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章