本章将学习 R 语言的循环语句。循环是编程中用来重复执行一段代码的核心机制------当你需要对一组数据做同样的操作时,手动写 N 遍显然不现实,循环帮你自动搞定。
一、为什么需要循环?
假设你要输出 1 到 5 的数字,不写循环是这样的:
r
print(1)
print(2)
print(3)
print(4)
print(5)
如果要求输出 1 到 100 呢?手动写 100 行?
循环让你用几行代码搞定重复任务。
二、for 循环(最常用)
for 循环会遍历一个序列,对序列中的每个元素执行一次代码块。
语法:
r
for (变量 in 序列) {
循环体(重复执行的代码)
}
1. 基础示例:输出 1 到 5
r
for (i in 1:5) {
print(i)
}
运行结果:
txt
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
1:5 是 R 中生成连续整数的快捷写法,表示从 1 到 5 的序列。
2. 遍历向量
r
fruits <- c("苹果", "香蕉", "橘子", "葡萄")
for (fruit in fruits) {
print(paste("我喜欢吃", fruit))
}
运行结果:
txt
[1] "我喜欢吃 苹果"
[1] "我喜欢吃 香蕉"
[1] "我喜欢吃 橘子"
[1] "我喜欢吃 葡萄"
3. 带索引的遍历
当你需要同时知道位置(索引)和值时:
r
fruits <- c("苹果", "香蕉", "橘子")
for (i in 1:length(fruits)) {
print(paste("第", i, "个水果是:", fruits[i]))
}
运行结果:
txt
[1] "第 1 个水果是: 苹果"
[1] "第 2 个水果是: 香蕉"
[1] "第 3 个水果是: 橘子"
length() 函数返回向量的长度,1:length(fruits) 生成 1, 2, 3 的索引序列。
4. 循环累加(求 1+2+...+100)
r
total <- 0
for (i in 1:100) {
total <- total + i
}
print(paste("1到100的和是:", total))
运行结果:
txt
[1] "1到100的和是: 5050"
三、while 循环(条件驱动)
while 循环在条件为 TRUE 时一直执行,适合不确定循环次数的场景。
语法:
r
while (条件) {
循环体
# 注意:必须有让条件变为 FALSE 的操作,否则死循环!
}
1. 基础示例
r
count <- 1
while (count <= 5) {
print(paste("当前计数:", count))
count <- count + 1 # 每次加1,最终让条件不成立
}
运行结果:
txt
[1] "当前计数: 1"
[1] "当前计数: 2"
[1] "当前计数: 3"
[1] "当前计数: 4"
[1] "当前计数: 5"
2. 实用示例:猜数字
r
target <- 7
guess <- 0
while (guess != target) {
guess <- guess + 1
print(paste("尝试猜:", guess))
}
print("猜对了!")
运行结果:
txt
[1] "尝试猜: 1"
[1] "尝试猜: 2"
[1] "尝试猜: 3"
[1] "尝试猜: 4"
[1] "尝试猜: 5"
[1] "尝试猜: 6"
[1] "尝试猜: 7"
[1] "猜对了!"
四、repeat 循环(了解即可)
R 还有一个 repeat 循环,它没有条件判断 ,必须用 break 手动跳出:
r
x <- 1
repeat {
print(x)
x <- x + 1
if (x > 5) {
break # 跳出循环
}
}
运行结果:
txt
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
五、循环控制:break 与 next
1. break:提前结束整个循环
r
for (i in 1:10) {
if (i == 5) {
break # 到5就停
}
print(i)
}
运行结果:
txt
[1] 1
[1] 2
[1] 3
[1] 4
2. next:跳过当前轮,继续下一轮
r
for (i in 1:6) {
if (i == 3) {
next # 跳过3
}
print(i)
}
运行结果:
txt
[1] 1
[1] 2
[1] 4
[1] 5
[1] 6
六、嵌套循环(循环里套循环)
当需要处理二维数据(如矩阵)时会用到嵌套循环:
r
# 打印九九乘法表(部分)
for (i in 1:3) {
for (j in 1:i) {
cat(i, "×", j, "=", i * j, "\t")
}
cat("\n") # 换行
}
运行结果:
txt
1 × 1 = 1
2 × 1 = 2 2 × 2 = 4
3 × 1 = 3 3 × 2 = 6 3 × 3 = 9
cat() 函数和 print() 类似,但不会输出 [1] 前缀,更适合拼接输出。\t 是制表符,\n 是换行符。
七、for 与 while 怎么选?
| 场景 | 推荐用 |
|---|---|
| 已知循环次数(如遍历 1 到 100) | for |
| 遍历向量/列表中的每个元素 | for |
| 不确定循环次数,靠条件终止 | while |
| 满足条件前一直执行 | while |
90% 的情况用 for 就够了,while 适合特殊场景。
八、综合实战练习(可直接复制运行)
r
# ==============================
# R 综合练习:循环应用
# 场景:学生成绩统计
# ==============================
# 1. 定义一组成绩
scores <- c(92, 85, 67, 73, 58, 95, 88, 41, 76, 81)
# 2. 用 for 循环统计及格与不及格人数
pass_count <- 0
fail_count <- 0
for (score in scores) {
if (score >= 60) {
pass_count <- pass_count + 1
} else {
fail_count <- fail_count + 1
}
}
print(paste("及格人数:", pass_count))
print(paste("不及格人数:", fail_count))
# 3. 用 while 循环找到第一个不及格的成绩
index <- 1
while (scores[index] >= 60) {
index <- index + 1
}
print(paste("第一个不及格的成绩是第", index, "个:", scores[index]))
# 4. 用 for + next 跳过无效成绩(负数),计算有效成绩平均分
mixed_scores <- c(90, 85, -1, 72, -5, 88, 60)
valid_total <- 0
valid_count <- 0
for (s in mixed_scores) {
if (s < 0) {
next # 跳过负数
}
valid_total <- valid_total + s
valid_count <- valid_count + 1
}
average <- valid_total / valid_count
print(paste("有效成绩平均分:", round(average, 2)))
运行结果:
txt
[1] "及格人数: 8"
[1] "不及格人数: 2"
[1] "第一个不及格的成绩是第 5 个: 58"
[1] "有效成绩平均分: 79"