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