在之前的教程中,我们学习了条件语句,它们控制R程序的结构,如if、if-else、嵌套的else if、switch语句等,以控制R程序的流程。在本教程中,还将讨论另一种控制结构来控制R程序执行流程,即循环。这些与C、PYTHON等其他编程语言中的控制结构相似。这些控制结构在处理数据分析或编写R函数时非常有用。
在R编程语言中,循环是一个基本概念。编程语言中的循环是我们日常生活中重复的例程和子例程。每个人每天的例程都是泡茶。在计算机语言中,这些过程可以存储为指令,每当通过创建函数调用时就执行。这些函数可以使用循环一遍又一遍地执行。最好将这些重复的例程放入函数中,以实现代码复用。
“循环”和“迭代”这些词通常与循环控制结构一起使用,它们通常意味着将一组重复的过程(相同代码的执行)进行分组或批处理,或将需要多次执行的类似操作组织成一个单一的结构。
当您想多次重复执行一个函数或一组语句时,最好使用循环,这样可以节省时间。循环的概念在所有编程语言中都是相似的,它们仅在语法上有所不同。

R中主要有三种循环类型:for循环、while循环和repeat循环。
在R文档中,除了for循环、while循环、repeat循环之外,您还可以看到一些额外的控制流结构,例如break、next等。
当处理大型数据集时,在R中使用循环有时效率低下。在这种情况下,您可以使用apply()函数家族,如`apply()`、`lapply()`、`tapply()`、`sapply()`、`vapply()`和`mapply()`。
注意:您可以使用apply函数家族代替`for循环`。
在R编程语言中,for循环的概念与任何其他编程语言中的for循环相同。
for循环是特殊的控制流结构,其中通过设置在迭代周期中递增的计数器或索引,执行预定义次数的循环。
当您想要迭代一个范围或一系列数据时,最简单易用的就是循环。在每次迭代期间,值存储在一个称为迭代器变量的变量中。
for(variable in sequence){
#perform some instructions
}
其中
考虑一个简单的for循环
#for loop in R
for(i in 1:10){
print(i)
}
for循环示例显示了从1到10的数字范围。范围1:10(1、2、3、4、5、6、7、8、9和10)中的值在每次迭代时都存储到变量a中。变量i是迭代器变量。for循环从执行i=1开始,并在控制台中打印i的值,即1。然后取下一个值,存储i=2,在i等于2时显示值。因此,执行继续进行,直到达到或取到范围内提到的最后一个值。在我们的示例中,当i=10显示后,for循环的执行退出迭代。
for循环的流程图使我们的理解更容易。

从这个例子可以非常清楚地看出,在循环中,相同的指令针对不同的值集多次执行。
让我们看看另一个例子,它通过使用c()函数创建向量来获取字符串字符输入。
#vector v with 5 character values
v<-c("Learn","eTutorials","for","R","Program")
for(i in 1:5){
print(v[i])
}
for循环遍历向量输入v中的每个字符。迭代器变量i持有向量v中第1个位置的值,即“Learn”。因此,当i=1在for循环执行期间,它访问并显示向量v的第一个元素v[1]=“Learn”在控制台中。在随后的迭代中,迭代器变量i的值不断变化,例如2,3,4,5。并且每次都会访问并显示向量中的相应元素,例如v[2] = "eTutorials", v[3] = "for"等。请看下面相同代码的输出。
[1] "Learn" [1] "eTutorials" [1] "for" [1] "R" [1] "Program"
for循环内的范围 (1:5) 可以使用 seq_along() 进行更改,它会输出相同的结果。
v<-c("Learn","eTutorials","for","R","Program")
for(i in seq_along(v)){
print(v[i])
}
seq 用于生成规则序列,是具有默认方法的标准通用函数。seq_along 是一个原始函数。语法是 `seq_along(along.with)`,它从传入的参数中获取长度。
在我们的例子中,输入向量v被传递给方法seq_along,该方法从参数的长度中获取长度,该长度等于5。该方法生成向量v中元素的序列(字符)。因此,for循环在迭代中使用此方法,类似于range()函数。
RStudio中显示seq()和seq_along()描述的片段如下所示

一个显示嵌套for循环的示例。一个for循环嵌套在另一个for循环中,这意味着一个嵌套的for循环。让我们从一个示例开始。
> MAT = matrix(1:6,2,3)
> MAT
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
#NESTED for-loop
for(i in seq_len(nrow(MAT))){ #i=1,2 nrow(number of rows of matrix)
#2 times loop iterates
for(j in seq_len(ncol(MAT))){ #j=1,2,3 ncol(number of matrix column )(3times iterates)
print(MAT[i,j])
}
}
让我们看看R程序中在矩阵中循环以打印矩阵内所有元素的完整源代码。

图片展示了嵌套for循环的工作原理,当第一个for循环for(i in seq_len(nrow(MAT)))开始执行时,i的值为1,取第一行,然后下一个for循环for(j in seq_len(ncol(MAT)))取列数序列j=1,2,3。当i=1且j=1时,访问矩阵的第一个元素1。当i=1,j=2和i=1,j=3时,重复相同的操作以完成迭代。
同样适用于下一行,当i=2时,通过循环遍历列j=1,2,3来显示矩阵元素。
#create a 2×3 matrix
MAT =matrix(1:6,2,3)
cat("The matrix MAT is \n")
print(MAT)
#NESTED for-loop
cat("The elements of matrix is \n")
for(i in seq_len(nrow(MAT))){ #i=1,2 nrow(number of rows of matrix)
for(j in seq_len(ncol(MAT))){ #j=1,2,3 ncol(number of matrix column )
print(MAT[i,j])
}
}
嵌套for循环生成的输出是
> rep(Vector1,times =3) [1] 5 45 19 5 45 19 5 45 19 > rep.int(Vector1,times =3) [1] 5 45 19 5 45 19 5 45 19 >
在R编程语言中,while循环是另一个主要的循环结构。while循环接受一个逻辑表达式,并根据逻辑表达式的验证结果执行循环。如果表达式或条件为真,则内部的代码块将被执行,否则在其他情况下将不执行。
while也是一个保留字,用于表示基本的控制流结构。
While(condition){
#perform some instructions
}
其中
示例
#while loop
i=1
while(i<=10){
print(i)
i=i+1
}
生成的输出是1到10的数字序列。当迭代器变量i变为10时,执行终止。如果i进一步递增,条件将无法满足。当i=11(i=10+1)时,检查条件(i<=10),其中11不小于10。此时条件变为FALSE并退出循环。
[1] 1 [1] 2 [1] 3 [1] 4 [1] 5 [1] 6 [1] 7 [1] 8 [1] 9 [1] 10
while循环的流程图

for循环和while循环都具有类似的功能。但它们在以下原因上彼此不同
例如,考虑显示数字1到10的简单代码,其中迭代器变量(i)的值在while循环执行之前初始化为1,即i=1。
#while loop
i=1
while(i<=10){
print(i)
i=i+1
}
上面的代码显示1, 2, 3 …10的数字范围,其中迭代器变量i通过指令i=i+1递增。如果未提供i=i+1,则while循环最终将无限次地显示范围中的初始值。
所以你可以总结一下,在while循环中需要初始化和递增迭代器变量(i)
注意:通常,当我们比较差异时,for循环比while循环更高效。
一个repeat循环允许重复执行任何代码块。与其他的控制结构不同,repeat循环没有任何条件需要满足才能成功执行,因此也无法退出或终止任何循环。
程序员负责在控制结构(可能是for循环、while循环)内部提供退出条件,以退出执行,否则会导致无限循环。通常,控制结构内的break语句能够终止无限执行,以避免重复相同的代码。
repeat {
# instruction to execute
....
....
if(condition) {
break
}
}
repeat循环的流程图

使用重复语句的程序
x = 5
# Print 5 to 10
repeat{
print(x)
x = x + 1
if(x > 10){
break
}
}
输出显示break语句中断了给定代码块的重复执行。
[1] 5 [1] 6 [1] 7 [1] 8 [1] 9 [1] 10
现在我们对R编程中的循环有了大致了解。在接下来的教程中,我们将详细学习在循环中使用的跳转语句,例如break、next等。