1996年,计算机科学家Bohm和Jacopini证明了任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。其中,顺序结构的概念最为简单,即代码的执行顺序是自上而下依次执行的。而选择结构和循环结构则相对来说复杂一些,需要利用具体的函数来实现,这里进行展开说明。
选择结构就是对于给定的条件来判断现实结果是否满足这个条件,并根据判断的结果来执行不同的程序流程。在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
函数中,如果满足第一个条件,那么执行第一项;否则,执行第二项。
在执行代码的时候,有时候需要反复实现某一个相同的功能,这就需要使用循环结构。在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
语句)。