第六章:for 循环与 while 循环语句

本章将学习 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"
相关推荐
小白学大数据4 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡4 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai4 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间5 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
小努蛋5 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
qz_Serene5 小时前
C++:类和对象(上)
开发语言·c++
西安景驰电子6 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php
ctlover6 小时前
Python文件操作
开发语言·python
luj_17686 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
霸道流氓气质6 小时前
基于本地 PaddleOCR 的 PDF 文字识别完整技术文档
开发语言·r语言·pdf