购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5 程序流程控制

1996年,计算机科学家Bohm和Jacopini证明了任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。其中,顺序结构的概念最为简单,即代码的执行顺序是自上而下依次执行的。而选择结构和循环结构则相对来说复杂一些,需要利用具体的函数来实现,这里进行展开说明。

2.5.1 选择结构

选择结构就是对于给定的条件来判断现实结果是否满足这个条件,并根据判断的结果来执行不同的程序流程。在R语言中,可以使用 if 语句来完成这个过程:

a = 2
if(a > 1) print("a > 1")
## [1] "a > 1"

上面这行代码的含义是,如果 a 大于 1 ,那么就打印 1 > 0 。当然,在后面我们还可以加上else语句,那么在条件不符合的时候,就可以执行其他选项:

a = 1
if(a > 1) print("a > 1") else print("a <= 1")
## [1] "a <= 1"

一般来说,在只有一条执行语句的时候,我们不需要写花括号。但是如果需要执行多个语句,则需要加上花括号。保险起见,应该在所有 if 语句和 else 语句之后都加上花括号,这能够保证代码不会出问题:

if(a > 1){
  print("a > 1")
}else{
  print("a <= 1")
}
## [1] "a <= 1"

此外,还可以利用 ifelse 函数来进行判断执行:

ifelse(a > 1,"a > 1","a <= 1")
## [1] "a <= 1"

ifelse 函数中,如果满足第一个条件,那么执行第一项;否则,执行第二项。

2.5.2 循环结构

在执行代码的时候,有时候需要反复实现某一个相同的功能,这就需要使用循环结构。在R语言中,最为常见的循环是 for 循环和 while 循环。其中,for循环就是对向量中的每一个值进行遍历,例如:

for(i in 1:5) {
  print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

上面这串代码,就是对 1:5 这个向量进行了遍历,即打印从1到5所有的正整数。一般来说,循环的内容放在花括号内,这样做容错性较高。另一种循环是 while 循环,只要满足一定条件,它就会一直执行下去;当条件不满足的时候,则会结束循环。下面,我们用 while 循环来重写一下上面用 for 循环实现的打印功能:

i = 1
while(i < 6){
  print(i)
  i = i + 1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

可以看到,我们首先在第一行初始化了 i 遍历,让它等于1,然后当 i 小于6的时候,就对 i 进行打印,并在每一次循环中让 i 再增加1(在程序中,是让本身加一复制给原来的变量,即 i = i + 1 )。此外,还有一种特殊的循环模式叫作 repeat ,它相当于 while(1){…} 。也就是说,这个循环如果没有内置的停止机制,就会一直运行下去,可以在里面附加条件语句来终止运行。我们还是以上面的打印功能为例进行编码:

i = 1
repeat{
  print(i)
  i = i + 1
  if(i >= 6) break
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

这里,我们依然要对 i 进行初始化,然后在每次循环中对 i 进行判断,如果 i 大于或等于6,则跳出循环(使用 break 语句)。有时,我们希望跳过某一个循环,例如在 i 等于3的时候,我们不要打印。这时候就可以使用 next 语句,实现方法如下:

for (i in 1:5) {
  if(i == 3) next
  print(i)
}
## [1] 1
## [1] 2
## [1] 4
## [1] 5

在上面的代码中,我们用 if i 变量进行判断,如果 i 等于3,则直接跳过这次循环(使用 next 语句)。 AEsK4mxTFw3eNPowGTduPqr/xzKDMV+vw+b9eQ7+Tb/mUi0AeTkpMZrTBMbF2cjw

点击中间区域
呼出菜单
上一章
目录
下一章
×