R语言在统计中的应用
上QQ阅读APP看书,第一时间看更新

§2.5 控制流

前面介绍的各种命令都是在R操作窗口上完成的,这样做对少量的命令还可以,但对于大量的命令既不方便,也不便于重复使用已操作过的命令. 事实上,R语言也是一种计算机语言,它可以进行编程和编写自己需要的函数,将操作过的命令编写成程序,这既便于保存,又便于以后使用.

在R语言中,每个命令可以看成一个语句(或表达式),语句之间由分号或换行分隔. 语句可以续行,只要前一行不是完整表达式(如末尾是加减乘除等运算符,或有未配对的括号),则下一行就是上一行的续行.

将若干个语句放在一起组成复合语句,复合语句的构造方法是将若干个语句放在花括号“{}”中.

R语言与其他高级语言一样,有分支、循环等程序控制结构,这些命令虽然不是R语言特有的,但了解这些控制语句,对以后的程序编写很有帮助.

§2.5.1 分支函数

分支函数有if / else和switch.

1. if/else函数

if/else函数多用于两分支,其使用格式为:

 if(cond) expr
 if(cond) cons.expr else alt.expr

第一种格式表示:如果条件cond成立,则执行表达式expr,否则跳过. 第二种格式表示:如果条件cond成立,则执行表达式cons.expr;否则,执行表达式alt.expr.

例如,如下命令

 if( any(x <= 0) ) y <- log(1+x) else y <- log(x)

表明:如果x的某个分量0时,对1+x取对数并对y赋值,否则直接对x取对数,再对y赋值. 该命令与下面的命令:

 y <- if( any(x <= 0) ) log(1+x) else log(x)

等价.

if/else函数可以嵌套使用,下面的做法:

 if ( cond_1 )
     expr_1
 else if ( cond_2 )
     expr_2
 else if ( cond_3 )
     expr_3
 else
     expr_4

是合法的.

2. switch函数

switch函数多用于多分支情况,其使用方法为:

 switch (expr, list)

参数expr为表达式.list为列表. 如果expr的取值在1~length(list)之间,则函数返回列表相应位置的值. 如果expr的值超出范围,则无返回值[8],如:

 > switch(1, 2+3, 2*3, 2/3)
 [1] 5
 > switch(2, 2+3, 2*3, 2/3)
 [1] 6
 > switch(3, 2+3, 2*3, 2/3)
 [1] 0.6666667
 > switch(6, 2+3, 2*3, 2/3)
 >

如果list有元素名,则当expr等于元素名时,返回变量名对应的值,否则无返回值,如:

 > y <- "fruit"
 > switch(y, fruit = "banana", vegetable = "broccoli", meat = "beef")
 [1] "banana"

§2.5.2 中止语句与空语句

中止语句是break,它的作用是强行中止循环,使程序跳到循环以外. 空语句是next,它表示继续执行,而不执行任何有实质性的内容. 关于break和next的用法,将结合循环语句来说明.

§2.5.3 循环函数

循环函数有for,while和repeat.

1. for函数

for函数的使用格式为:

 for(var in seq) expr

参数var为循环变量,seq为向量表达式(通常是个序列,如1:20),expr通常为一组表达式.

例如,构造一个4阶的Hilbert矩阵.

 > n <- 4; x <- array(0, dim = c(n, n))
 > for (i in 1:n){
 +     for (j in 1:n){
 +         x[i,j] <- 1/(i+j-1)
 +     }
 + }
 > x
           [,1]      [,2]      [,3]      [,4]
 [1,] 1.0000000 0.5000000 0.3333333 0.2500000
 [2,] 0.5000000 0.3333333 0.2500000 0.2000000
 [3,] 0.3333333 0.2500000 0.2000000 0.1666667
 [4,] 0.2500000 0.2000000 0.1666667 0.1428571

注意:第一列中的+是计算机自动添加的,表示本行语句为上一行的续行.

2. while函数

while函数的使用格式为:

 while (cond) expr

当条件cond成立,则执行表达式expr. 例如,编写一个计算1000以内的Fibonacci数.

 > f <- c(1,1); i <- 1
 > while (f[i] + f[i+1] < 1000) {
 +        f[i+2] <- f[i] + f[i+1]
 +        i <- i + 1;
 + }
 > f
  [1] 1 1 2 3 5 8 13 21 34 55 89 144
 [13] 233 377 610 987

3. repeat函数

repeat函数的使用格式为:

 repeat expr

repeat函数依赖中止语句(break)跳出循环. 例如,使用repeat编写一个计算1 000以内的Fibonacci数的程序.

 > f <- c(1,1); i <- 1
 > repeat {
 +     f[i+2] <- f[i] + f[i+1]
 +     i <- i + 1
 +     if (f[i] + f[i+1] >= 1000) break
 + }

或将条件语句改为

 if (f[i] + f[i+1] < 1000) next else break

也有同样的计算结果.