条件语句
条件语句的一般形式:
if (condition) true_expression else false_expression
或者:
if (condition) expression
表达式并非总是被执行,所以if
函数的类型是special:
> typeof(`if`)
[1] "special"
R中,条件语句不是向量型运算。如果条件语句是由一个以上的逻辑值组成的向量,那么执行该语句时只会用到向量的第1个元素。例如:
> x <- 10
> y <- seq(6,17)
> if (x < y) x else y
[1] 6 7 8 9 10 11 12 13 14 15 16 17
Warning message:
In if (x < y) x else y : 条件的长度大于一,因此只能用其第一元素
如果我们想要执行向量化的运算,这时候可以采用ifelse
函数:
> x <- 10
> y <- seq(6,17)
> ifelse(x<y, x, y)
[1] 6 7 8 9 10 10 10 10 10 10 10 10
如果要根据不同的单个输入返回不同的值,可以用下面的代码实现这个功能:
> switcheroo.if.then <- function(x){
+ if (x == "a")
+ "camel"
+ else if (x == "b")
+ "bear"
+ else if (x == "c")
+ "camel"
+ else
+ "moose"
+ }
上述代码本身略显冗长。接触过其他编程的朋友肯定接触过不少类switch
或case
的语句,R也存在着switch
函数,所以我们可以用下面的语句实现该功能:
> switcheroo.switch <- function(x){
+ switch(x,
+ a="alligator",
+ b="bear",
+ c="camel",
+ "moose")
+ }
可以测试它们的结果
> switcheroo.if.then("a")
[1] "camel"
> switcheroo.if.then("f")
[1] "moose"
> switcheroo.switch("a")
[1] "alligator"
> switcheroo.switch("f")
[1] "moose"
循环
R中存在三种不同的循环结构。最简单的是repeat
,它只是重复同一个表达式:
repeat expression
若要跳出循环,可以使用break
命令。若要跳到循环的下一轮迭代,可以用next
命令。
下面例子中输出所有不大于25的5的倍数:
> i <- 5
> repeat {if (i > 25) break else{print(i); i <- i + 5;}}
[1] 5
[1] 10
[1] 15
[1] 20
[1] 25
不过不使用break
语句,命令将是一个死循环。
另外一个有用的循环结构是while
,该结构在某个条件为真时,重复某个特定的表达式:
while (condition) expression
上个例子可以用while
写出来:
> i <- 5
> while (i <= 25) {print(i); i <- i + 5}
[1] 5
[1] 10
[1] 15
[1] 20
[1] 25
同样地,我们可以在while循环中使用break
与next
命令。
最后一个是各种语言必然有的for
循环,该结构遍历向量或列表中的每一个项目:
for (var in list) expression
同样我们用for
循环来实现上面的例子:
> for (i in seq(from=5, to=25, by=5)) print(i)
[1] 5
[1] 10
[1] 15
[1] 20
[1] 25
初学者使用R的for
循环需要注意:括号里有个in
,我刚开始经常因为这个问题导致报错或者结果错误。
循环语句有两个需要记住的重要属性:
- 循环内的计算结果不打印在屏幕上,除非你显式地调用
print
函数。 - for循环中的
var
变量在命令环境中是变化的。