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