§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
也有同样的计算结果.