←
PDF 341 / 520 Every for loop has three components:
→
English · PDF 341
Original PDF page 341
中文 · PDF 341

每个 for 循环都有三个组成部分:

输出 output <- vector("double", length(x))

在开始循环之前,你必须始终为输出分配足够的空间。这对效率非常重要:如果你在每次迭代中使用 c()(例如)来增长 for 循环,你的 for 循环会非常慢。

创建给定长度的空向量的一种通用方法是使用 vector() 函数。它有两个参数:向量的类型("logical"、"integer"、"double"、"character" 等)和向量的长度。

序列 i in seq_along(df)

这决定了循环的对象:for 循环的每次运行都会将 i 赋值为 seq_along(df) 中的一个不同值。把 i 想象成一个代词(比如“它”)会很有帮助。

你可能之前没有见过 seq_along()。它是常见的 1:length(l) 的安全版本,但有一个重要区别:如果你有一个长度为零的向量,seq_along() 会做出正确的处理:

y <- vector("double", 0) seq_along(y) #> integer(0) 1:length(y) #> [1] 1 0

你可能不会故意创建长度为零的向量,但很容易不小心创建出来。如果你使用 1:length(x) 而不是 seq_along(x),你很可能会得到一条令人困惑的错误信息。

循环体 output[[i]] <- median(df[[i]])

这是完成实际工作的代码。它会被反复运行,每次使用不同的 i 值。第一次迭代会运行 output[[1]] <- median(df[[1]]),第二次会运行 output[[2]] <- median(df[[2]]),依此类推。

这就是 for 循环的全部内容!现在是时候通过下面的练习来实践创建一些基本的(以及不那么基本的)for 循环了。然后我们将继续学习 for 循环的一些变体,它们能帮助你解决实践中会出现的其他问题。