2017-01-15 13:36:18
当用到大段代码时,控制结构用来控制程序的运行逻辑。常见的有:
if, elseswitchfor: 固定次数的循环while: 符合某种条件时循环repeat: 无限循环break: 终止循环next: 跳出某若干轮循环return: 跳出函数if…elseelse不是必需的。
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
}
}
repeatrepeat启动一个无限循环,必须搭配一个稳妥的break命令在适当时机结束循环。
x0 <- 1
tol <- 1e-8
repeat {
x1 <- computeEstimate()
if(abs(x1 - x0) < tol) {
break
} else {
x0 <- x1
}
}
next, returnnext用于跳过循环体的某几轮,而return则用于终止函数执行,并向上返回结果值。
for (i in 1:100) {
if (i <= 20) {
## 跳出前20次循环
next
}
## <执行代码>
}
Thank you!