2017-01-15 13:36:18

目录

控制结构

常见控制结构

当用到大段代码时,控制结构用来控制程序的运行逻辑。常见的有:

  • 条件:
    • if, else
    • switch
  • 循环:
    • for: 固定次数的循环
    • while: 符合某种条件时循环
    • repeat: 无限循环
    • break: 终止循环
    • next: 跳出某若干轮循环
  • return: 跳出函数

条件

ifelse

else不是必需的。

if (<条件>) {
    ## 执行代码
} else {
    ## 执行另一些代码
}

if (<条件1>) {
    ## 执行代码
} else if (<条件2>)  {
    ## 执行另一些代码
} else {
    ## 执行另一些代码
}

举例

if (x > 3) {
    y <- 10
} else {
    y <- 0
}
y <- if (x > 3) 10 else 0

switch

用于离散型标量,符合某个条件即返回对应的表达式。

switch(expr, <case1> = <result1>, <case2> = <result2>, ...)
centre <- function(x, type = c("mean", "median", "trimmed")) {
    type <- match.arg(type)
    switch(type,
        mean = mean(x),
        median = median(x),
        trimmed = mean(x, trim = .1))
}
centre(rcauchy(10), "mean")

循环

for循环

for逐个遍历一个控制变量,并执行循环体内的代码。常用来遍历一个list。

for (i in 1:10) {
    print(i)
}

下面几个循环语句的结果是一样的。

x <- c("a", "b", "c", "d")

for (i in 1:4) print(x[i])
for (i in seq_along(x)) print(x[i])
for (letter in x) print(letter)
for (i in 1:4) print(x[i])

嵌套的for循环

for循环也可以嵌套用(但效率会很低)。

x <- matrix(1:6, 2, 3)

for (i in seq_len(nrow(x))) {
    for (j in seq_len(ncol(x))) {
        print(x[i, j])
    }   
}

while循环

While循环每循环一遍就检测一下控制条件,如果为真,则循环执行循环体代码;一旦为假,则停止循环。 如果控制条件始终无法达到,将进入死循环。

count <- 0
while (count < 10) {
    print(count)
    count <- count + 1
}

while循环(续)

也可以检测多个条件。

z <- 5

while (z >= 3 && z <= 10) {
    print(z)
    coin <- rbinom(1, 1, 0.5)
    
    if (coin == 1) {  ## random walk
        z <- z + 1
    } else {
        z <- z - 1
    } 
}

repeat

repeat启动一个无限循环,必须搭配一个稳妥的break命令在适当时机结束循环。

x0 <- 1
tol <- 1e-8

repeat {
    x1 <- computeEstimate()
    
    if(abs(x1 - x0) < tol) {
        break
    } else {
        x0 <- x1
    } 
}

next, return

next用于跳过循环体的某几轮,而return则用于终止函数执行,并向上返回结果值。

for (i in 1:100) {
    if (i <= 20) {
        ## 跳出前20次循环
        next 
    }
    ## <执行代码>
}