R 循环详解:for、while 与 repeat 的实战指南

📅 2026/8/20 23:02:57
R 循环详解:for、while 与 repeat 的实战指南
1. 引言循环是 R 语言编程中最基础也最常用的控制结构之一。无论是批量处理数据、迭代计算还是模拟随机过程循环都扮演着不可或缺的角色。本文将系统讲解 R 语言中的三种循环结构——for、while和repeat并通过丰富的代码实例帮助你快速掌握它们的用法、适用场景以及常见陷阱。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] 52.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] 50502.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 ] 93. while 循环while 循环在每次迭代开始前检查条件只要条件为真就继续执行循环体。它适用于循环次数不确定、需要根据运行状态动态判断的场景。基本语法如下while (条件) { # 循环体 }3.1 基础示例计数循环count - 1 while (count 5) { print(count) count - count 1 }运行结果[1] 1 [1] 2 [1] 3 [1] 4 [1] 53.2 模拟掷骰子直到出现 6set.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 894. 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] 54.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 提供了两个重要的循环控制语句break和next。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] 106. 实战案例批量处理数据下面通过一个综合案例演示如何用循环批量处理数据框中的多列数据。# 创建示例数据框 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 家族函数在确实需要循环时注意预分配内存、避免无限循环并保持代码的可读性。