R 循环详解:for、while 与 repeat 的实战指南
2026/8/20 23:02:55 网站建设 项目流程

1. 引言

循环是 R 语言编程中最基础也最常用的控制结构之一。无论是批量处理数据、迭代计算,还是模拟随机过程,循环都扮演着不可或缺的角色。本文将系统讲解 R 语言中的三种循环结构——forwhilerepeat,并通过丰富的代码实例帮助你快速掌握它们的用法、适用场景以及常见陷阱。

2. for 循环

for 循环是 R 中最常用的循环结构,它会对一个向量或列表中的每个元素依次执行相同的操作。其基本语法如下:

for (变量 in 序列) { # 循环体 }

下面通过几个实例来演示 for 循环的用法。

2.1 基础示例:遍历向量

# 遍历 1 到 5 for (i in 1:5) { print(i) }

运行结果:

[1] 1 [1] 2 [1] 3 [1] 4 [1] 5

2.2 遍历字符向量

fruits <- c("苹果", "香蕉", "橙子") for (fruit in fruits) { print(paste("我喜欢吃", fruit)) }

运行结果:

[1] "我喜欢吃 苹果" [1] "我喜欢吃 香蕉" [1] "我喜欢吃 橙子"

2.3 累加求和

# 计算 1 到 100 的和 total <- 0 for (i in 1:100) { total <- total + i } print(total)

运行结果:

[1] 5050

2.4 嵌套 for 循环

当需要处理二维数据结构(如矩阵)时,可以使用嵌套循环:

# 创建一个 3x3 矩阵并逐元素输出 mat <- matrix(1:9, nrow = 3) for (i in 1:nrow(mat)) { for (j in 1:ncol(mat)) { cat("mat[", i, ",", j, "] =", mat[i, j], "\n") } }

运行结果:

mat[ 1 , 1 ] = 1 mat[ 1 , 2 ] = 4 mat[ 1 , 3 ] = 7 mat[ 2 , 1 ] = 2 mat[ 2 , 2 ] = 5 mat[ 2 , 3 ] = 8 mat[ 3 , 1 ] = 3 mat[ 3 , 2 ] = 6 mat[ 3 , 3 ] = 9

3. while 循环

while 循环在每次迭代开始前检查条件,只要条件为真就继续执行循环体。它适用于循环次数不确定、需要根据运行状态动态判断的场景。基本语法如下:

while (条件) { # 循环体 }

3.1 基础示例:计数循环

count <- 1 while (count <= 5) { print(count) count <- count + 1 }

运行结果:

[1] 1 [1] 2 [1] 3 [1] 4 [1] 5

3.2 模拟掷骰子直到出现 6

set.seed(42) roll <- 0 attempts <- 0 while (roll != 6) { roll <- sample(1:6, 1) attempts <- attempts + 1 } cat("掷了", attempts, "次才得到 6\n")

3.3 计算斐波那契数列

# 输出不超过 100 的斐波那契数列 a <- 1 b <- 1 cat(a, b, " ") while (a + b <= 100) { c <- a + b cat(c, " ") a <- b b <- c }

运行结果:

1 1 2 3 5 8 13 21 34 55 89

4. repeat 循环

repeat 循环会无限执行循环体,直到遇到 break 语句才退出。它适合那些需要至少执行一次、且退出条件在循环体内部判断的场景。基本语法如下:

repeat { # 循环体 if (退出条件) { break } }

4.1 基础示例:配合 break 退出

x <- 1 repeat { print(x) x <- x + 1 if (x > 5) { break } }

运行结果:

[1] 1 [1] 2 [1] 3 [1] 4 [1] 5

4.2 模拟随机游走

set.seed(123) position <- 0 steps <- 0 repeat { position <- position + sample(c(-1, 1), 1) steps <- steps + 1 if (abs(position) >= 5) { break } } cat("经过", steps, "步到达位置", position, "\n")

5. 循环控制语句

R 提供了两个重要的循环控制语句:breaknext

5.1 break:立即退出循环

# 找到第一个大于 10 的平方数 for (i in 1:10) { square <- i^2 if (square > 10) { cat("第一个大于 10 的平方数是", square, "(i =", i, ")\n") break } }

运行结果:

第一个大于 10 的平方数是 16 (i = 4 )

5.2 next:跳过当前迭代

# 输出 1 到 10 中的偶数 for (i in 1:10) { if (i %% 2 != 0) { next } print(i) }

运行结果:

[1] 2 [1] 4 [1] 6 [1] 8 [1] 10

6. 实战案例:批量处理数据

下面通过一个综合案例,演示如何用循环批量处理数据框中的多列数据。

# 创建示例数据框 df <- data.frame( id = 1:5, score1 = c(85, 90, 78, 92, 88), score2 = c(80, 85, 82, 95, 79), score3 = c(88, 92, 75, 89, 91) ) 计算每个学生的平均分 df$average <- NA for (i in 1:nrow(df)) { df$average[i] <- mean(c(df$score1[i], df$score2[i], df$score3[i])) } 根据平均分评定等级 df$grade <- NA for (i in 1:nrow(df)) { if (df$average[i] >= 90) { df$grade[i] <- "优秀" } else if (df$average[i] >= 80) { df$grade[i] <- "良好" } else { df$grade[i] <- "及格" } } print(df)

运行结果:

id score1 score2 score3 average grade 1 1 85 80 88 84.33333 良好 2 2 90 85 92 89.00000 良好 3 3 78 82 75 78.33333 及格 4 4 92 95 89 92.00000 优秀 5 5 88 79 91 86.00000 良好

7. 常见陷阱与注意事项

在使用循环时,有几个常见问题需要特别注意:

  • 无限循环:while 和 repeat 循环中,如果忘记更新循环变量或退出条件永远无法满足,会导致无限循环。务必确保循环体内有改变条件的语句。
  • 向量化替代:R 是向量化语言,很多循环操作可以用 apply 家族函数(如 lapply、sapply)或向量化运算替代,效率更高。例如求和可以直接用sum(1:100),无需循环。
  • 预分配内存:在循环中逐次拼接向量会非常慢,建议预先分配结果向量的长度。
  • 作用域问题:循环中创建的变量在循环结束后仍然存在,注意避免变量名冲突。

7.1 预分配内存示例

# 不推荐:逐次拼接 result <- c() for (i in 1:10000) { result <- c(result, i^2) } 推荐:预分配内存 result2 <- numeric(10000) for (i in 1:10000) { result2[i] <- i^2 }

8. 总结

本文详细介绍了 R 语言中的三种循环结构:for 循环适合遍历已知序列,while 循环适合条件驱动的迭代,repeat 循环适合至少执行一次且退出条件在循环体内部的场景。同时介绍了 break 和 next 两个控制语句的用法。在实际开发中,建议优先考虑 R 的向量化操作和 apply 家族函数,在确实需要循环时,注意预分配内存、避免无限循环,并保持代码的可读性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询