诗翔的R语言学习之路Cook R数据科学与R语言

【r<-基础|理论】R的控制结构

2017-09-12  本文已影响57人  王诗翔

条件语句

条件语句的一般形式:

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"
+ }

上述代码本身略显冗长。接触过其他编程的朋友肯定接触过不少类switchcase的语句,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循环中使用breaknext命令。

最后一个是各种语言必然有的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,我刚开始经常因为这个问题导致报错或者结果错误。

循环语句有两个需要记住的重要属性:

  1. 循环内的计算结果不打印在屏幕上,除非你显式地调用print函数。
  2. for循环中的var变量在命令环境中是变化的。
上一篇下一篇

猜你喜欢

热点阅读