R语言循环语句 #
一、循环语句概述 #
循环语句用于重复执行代码块,R语言提供了for、while、repeat三种循环结构。
二、for循环 #
2.1 基本语法 #
r
for (variable in sequence) {
}
2.2 遍历向量 #
r
fruits <- c("apple", "banana", "cherry")
for (fruit in fruits) {
print(fruit)
}
2.3 使用索引 #
r
x <- c(10, 20, 30, 40, 50)
for (i in 1:length(x)) {
print(paste("索引", i, ":", x[i]))
}
for (i in seq_along(x)) {
print(paste("索引", i, ":", x[i]))
}
2.4 遍历序列 #
r
for (i in 1:5) {
print(i)
}
for (i in seq(1, 10, by = 2)) {
print(i)
}
2.5 嵌套for循环 #
r
for (i in 1:3) {
for (j in 1:3) {
print(paste("i =", i, ", j =", j))
}
}
2.6 遍历矩阵 #
r
m <- matrix(1:6, nrow = 2, ncol = 3)
for (i in 1:nrow(m)) {
for (j in 1:ncol(m)) {
print(paste("m[", i, ",", j, "] =", m[i, j]))
}
}
2.7 遍历列表 #
r
my_list <- list(a = 1, b = 2, c = 3)
for (name in names(my_list)) {
print(paste(name, ":", my_list[[name]]))
}
for (i in seq_along(my_list)) {
print(paste(names(my_list)[i], ":", my_list[[i]]))
}
三、while循环 #
3.1 基本语法 #
r
while (condition) {
}
3.2 基本示例 #
r
i <- 1
while (i <= 5) {
print(i)
i <- i + 1
}
3.3 累加求和 #
r
sum <- 0
i <- 1
while (i <= 10) {
sum <- sum + i
i <- i + 1
}
print(sum)
3.4 条件循环 #
r
x <- 100
while (x > 10) {
print(x)
x <- x / 2
}
3.5 输入验证 #
r
input <- ""
while (input != "quit") {
input <- readline(prompt = "输入内容(输入quit退出): ")
print(paste("你输入了:", input))
}
四、repeat循环 #
4.1 基本语法 #
r
repeat {
if (condition) {
break
}
}
4.2 基本示例 #
r
i <- 1
repeat {
print(i)
i <- i + 1
if (i > 5) {
break
}
}
4.3 无限循环 #
r
repeat {
input <- readline(prompt = "输入quit退出: ")
if (input == "quit") {
break
}
print(paste("你输入了:", input))
}
4.4 收敛判断 #
r
x <- 100
prev_x <- 0
tolerance <- 0.001
repeat {
prev_x <- x
x <- x / 2
if (abs(x - prev_x) < tolerance) {
break
}
}
print(x)
五、循环控制 #
5.1 break语句 #
r
for (i in 1:10) {
if (i == 5) {
break
}
print(i)
}
5.2 next语句 #
r
for (i in 1:10) {
if (i %% 2 == 0) {
next
}
print(i)
}
5.3 组合使用 #
r
for (i in 1:20) {
if (i == 15) {
break
}
if (i %% 3 == 0) {
next
}
print(i)
}
六、循环与向量化 #
6.1 避免显式循环 #
r
x <- 1:1000000
system.time({
result <- numeric(length(x))
for (i in seq_along(x)) {
result[i] <- x[i] ^ 2
}
})
system.time({
result <- x ^ 2
})
6.2 使用apply函数族 #
r
x <- list(a = 1:5, b = 6:10, c = 11:15)
result <- lapply(x, sum)
print(result)
result <- sapply(x, mean)
print(result)
6.3 使用sapply替代循环 #
r
x <- 1:10
result <- sapply(x, function(i) i ^ 2)
print(result)
七、循环性能优化 #
7.1 预分配内存 #
r
n <- 10000
system.time({
result <- c()
for (i in 1:n) {
result <- c(result, i ^ 2)
}
})
system.time({
result <- numeric(n)
for (i in 1:n) {
result[i] <- i ^ 2
}
})
7.2 使用向量化函数 #
r
x <- 1:10000
system.time({
result <- numeric(length(x))
for (i in seq_along(x)) {
result[i] <- sqrt(x[i])
}
})
system.time({
result <- sqrt(x)
})
7.3 避免在循环中增长对象 #
r
n <- 1000
slow <- function() {
result <- c()
for (i in 1:n) {
result <- c(result, i)
}
result
}
fast <- function() {
result <- numeric(n)
for (i in 1:n) {
result[i] <- i
}
result
}
八、实践示例 #
8.1 斐波那契数列 #
r
fibonacci <- function(n) {
if (n <= 2) {
return(rep(1, n))
}
fib <- numeric(n)
fib[1] <- 1
fib[2] <- 1
for (i in 3:n) {
fib[i] <- fib[i-1] + fib[i-2]
}
fib
}
fibonacci(10)
8.2 素数判断 #
r
is_prime <- function(n) {
if (n <= 1) return(FALSE)
if (n == 2) return(TRUE)
if (n %% 2 == 0) return(FALSE)
for (i in 3:sqrt(n)) {
if (n %% i == 0) {
return(FALSE)
}
}
TRUE
}
is_prime(17)
is_prime(18)
8.3 二分查找 #
r
binary_search <- function(arr, target) {
low <- 1
high <- length(arr)
while (low <= high) {
mid <- floor((low + high) / 2)
if (arr[mid] == target) {
return(mid)
} else if (arr[mid] < target) {
low <- mid + 1
} else {
high <- mid - 1
}
}
-1
}
x <- 1:100
binary_search(x, 50)
8.4 梯度下降 #
r
gradient_descent <- function(f, grad_f, x0, learning_rate = 0.01, max_iter = 1000, tol = 1e-6) {
x <- x0
for (i in 1:max_iter) {
gradient <- grad_f(x)
x_new <- x - learning_rate * gradient
if (abs(x_new - x) < tol) {
break
}
x <- x_new
}
x
}
f <- function(x) x^2
grad_f <- function(x) 2*x
gradient_descent(f, grad_f, 10)
九、总结 #
本章学习了:
- for循环遍历向量、列表、矩阵
- while循环条件执行
- repeat循环无限循环
- break和next控制循环
- 循环与向量化的选择
- 循环性能优化技巧
循环是编程的基础结构,但在R语言中应优先考虑向量化操作!
最后更新:2026-03-27