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

作者: 王诗翔 | 来源:发表于2017-09-12 18: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变量在命令环境中是变化的。

    相关文章

      网友评论

        本文标题:【r<-基础|理论】R的控制结构

        本文链接:https://www.haomeiwen.com/subject/mwxhsxtx.html