R语言循环控制 #
一、循环控制概述 #
R语言提供了break和next语句来控制循环的执行流程。
二、break语句 #
2.1 基本用法 #
break语句用于立即终止循环。
r
for (i in 1:10) {
if (i == 5) {
break
}
print(i)
}
2.2 在while循环中使用 #
r
i <- 1
while (TRUE) {
print(i)
i <- i + 1
if (i > 5) {
break
}
}
2.3 在repeat循环中使用 #
r
i <- 1
repeat {
print(i)
i <- i + 1
if (i > 5) {
break
}
}
2.4 查找元素 #
r
x <- c(10, 20, 30, 40, 50)
target <- 30
for (i in seq_along(x)) {
if (x[i] == target) {
print(paste("找到目标,位置:", i))
break
}
}
2.5 条件终止 #
r
sum <- 0
for (i in 1:100) {
sum <- sum + i
if (sum > 100) {
print(paste("在i =", i, "时,sum =", sum))
break
}
}
2.6 嵌套循环中的break #
r
for (i in 1:3) {
for (j in 1:3) {
if (i == 2 && j == 2) {
break
}
print(paste("i =", i, ", j =", j))
}
}
三、next语句 #
3.1 基本用法 #
next语句用于跳过当前迭代,继续下一次迭代。
r
for (i in 1:10) {
if (i %% 2 == 0) {
next
}
print(i)
}
3.2 跳过特定值 #
r
x <- c(10, NA, 20, NA, 30)
for (i in seq_along(x)) {
if (is.na(x[i])) {
next
}
print(x[i])
}
3.3 过滤数据 #
r
data <- data.frame(
name = c("张三", "李四", "王五"),
score = c(85, 45, 90)
)
for (i in 1:nrow(data)) {
if (data$score[i] < 60) {
next
}
print(paste(data$name[i], ":", data$score[i]))
}
3.4 处理异常值 #
r
x <- c(1, 2, -1, 4, -2, 6)
for (i in seq_along(x)) {
if (x[i] < 0) {
next
}
print(sqrt(x[i]))
}
四、break与next组合 #
4.1 组合使用 #
r
for (i in 1:20) {
if (i == 15) {
break
}
if (i %% 3 == 0) {
next
}
print(i)
}
4.2 复杂条件控制 #
r
x <- c(10, 20, -1, 30, -2, 40, 50)
sum <- 0
for (i in seq_along(x)) {
if (x[i] < 0) {
next
}
sum <- sum + x[i]
if (sum > 80) {
break
}
}
print(sum)
五、循环优化 #
5.1 预分配内存 #
r
n <- 10000
slow <- function(n) {
result <- c()
for (i in 1:n) {
result <- c(result, i ^ 2)
}
result
}
fast <- function(n) {
result <- numeric(n)
for (i in 1:n) {
result[i] <- i ^ 2
}
result
}
system.time(slow(n))
system.time(fast(n))
5.2 向量化替代 #
r
n <- 10000
loop_version <- function(n) {
result <- numeric(n)
for (i in 1:n) {
result[i] <- sqrt(i)
}
result
}
vector_version <- function(n) {
sqrt(1:n)
}
system.time(loop_version(n))
system.time(vector_version(n))
5.3 使用apply函数 #
r
x <- list(a = 1:5, b = 6:10, c = 11:15)
loop_version <- function(x) {
result <- list()
for (name in names(x)) {
result[[name]] <- sum(x[[name]])
}
result
}
apply_version <- function(x) {
lapply(x, sum)
}
system.time(loop_version(x))
system.time(apply_version(x))
5.4 避免重复计算 #
r
x <- rnorm(10000)
slow <- function(x) {
result <- numeric(length(x))
for (i in seq_along(x)) {
result[i] <- x[i] * mean(x)
}
result
}
fast <- function(x) {
avg <- mean(x)
result <- numeric(length(x))
for (i in seq_along(x)) {
result[i] <- x[i] * avg
}
result
}
system.time(slow(x))
system.time(fast(x))
六、循环设计模式 #
6.1 累加模式 #
r
sum <- 0
for (i in 1:10) {
sum <- sum + i
}
print(sum)
6.2 收集模式 #
r
results <- list()
for (i in 1:5) {
results[[i]] <- i ^ 2
}
print(results)
6.3 查找模式 #
r
x <- c(10, 20, 30, 40, 50)
target <- 30
found <- FALSE
for (i in seq_along(x)) {
if (x[i] == target) {
found <- TRUE
break
}
}
print(found)
6.4 过滤模式 #
r
x <- c(10, 20, 30, 40, 50)
filtered <- c()
for (i in seq_along(x)) {
if (x[i] > 25) {
filtered <- c(filtered, x[i])
}
}
print(filtered)
6.5 计数模式 #
r
x <- c(10, 20, 30, 40, 50)
count <- 0
for (i in seq_along(x)) {
if (x[i] > 25) {
count <- count + 1
}
}
print(count)
七、实践示例 #
7.1 数据处理 #
r
process_data <- function(data) {
results <- numeric(length(data))
for (i in seq_along(data)) {
if (is.na(data[i])) {
next
}
if (data[i] < 0) {
results[i] <- NA
next
}
results[i] <- sqrt(data[i])
}
results
}
x <- c(4, 9, -1, NA, 16)
process_data(x)
7.2 模拟退火 #
r
simulated_annealing <- function(f, x0, max_iter = 1000) {
x <- x0
best_x <- x0
best_value <- f(x0)
for (i in 1:max_iter) {
x_new <- x + rnorm(1, 0, 0.1)
value_new <- f(x_new)
if (value_new < best_value) {
best_x <- x_new
best_value <- value_new
}
if (abs(value_new - best_value) < 1e-10) {
break
}
x <- x_new
}
list(x = best_x, value = best_value)
}
f <- function(x) x^2
result <- simulated_annealing(f, 10)
print(result)
7.3 批量文件处理 #
r
process_files <- function(files) {
results <- list()
for (file in files) {
if (!file.exists(file)) {
warning(paste("文件不存在:", file))
next
}
tryCatch({
data <- read.csv(file)
results[[file]] <- nrow(data)
}, error = function(e) {
warning(paste("处理文件失败:", file))
})
}
results
}
八、总结 #
本章学习了:
- break语句终止循环
- next语句跳过迭代
- break与next组合使用
- 循环性能优化技巧
- 常见循环设计模式
- 实际应用示例
合理使用循环控制语句可以使代码更加简洁高效!
最后更新:2026-03-27