2017-01-15 13:36:18
当用到大段代码时,控制结构用来控制程序的运行逻辑。常见的有:
if
, else
switch
for
: 固定次数的循环while
: 符合某种条件时循环repeat
: 无限循环break
: 终止循环next
: 跳出某若干轮循环return
: 跳出函数if
…else
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 } ## <执行代码> }
Thank you!