R中的循环示例 - For、While和Repeat循环


2022年4月8日, Learn eTutorial
3012

在之前的教程中,我们学习了条件语句,它们控制R程序的结构,如if、if-else、嵌套的else if、switch语句等,以控制R程序的流程。在本教程中,还将讨论另一种控制结构来控制R程序执行流程,即循环。这些与C、PYTHON等其他编程语言中的控制结构相似。这些控制结构在处理数据分析或编写R函数时非常有用。

R中的循环是什么?

在R编程语言中,循环是一个基本概念。编程语言中的循环是我们日常生活中重复的例程和子例程。每个人每天的例程都是泡茶。在计算机语言中,这些过程可以存储为指令,每当通过创建函数调用时就执行。这些函数可以使用循环一遍又一遍地执行。最好将这些重复的例程放入函数中,以实现代码复用。

“循环”和“迭代”这些词通常与循环控制结构一起使用,它们通常意味着将一组重复的过程(相同代码的执行)进行分组或批处理,或将需要多次执行的类似操作组织成一个单一的结构。

当您想多次重复执行一个函数或一组语句时,最好使用循环,这样可以节省时间。循环的概念在所有编程语言中都是相似的,它们仅在语法上有所不同。

  • 循环允许连续多次执行一个代码块。
  • 循环的执行定义了某些条件。
  • 循环持续执行,直到满足停止条件,然后控制权移出循环。
loops img

R中主要有三种循环类型:for循环、while循环和repeat循环。

  • for循环是特殊的控制流结构,其中通过设置在迭代周期中递增的计数器或索引,执行预定义次数的循环。
  • while或repeat循环属于需要验证逻辑条件的循环结构。只有在循环结构的开始或结束时验证条件后,执行才会开始,否则就会终止。

在R文档中,除了for循环、while循环、repeat循环之外,您还可以看到一些额外的控制流结构,例如break、next等。

当处理大型数据集时,在R中使用循环有时效率低下。在这种情况下,您可以使用apply()函数家族,如`apply()`、`lapply()`、`tapply()`、`sapply()`、`vapply()`和`mapply()`。

注意:您可以使用apply函数家族代替`for循环`。

R中的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循环的流程图使我们的理解更容易。

for loop flowchart

从这个例子可以非常清楚地看出,在循环中,相同的指令针对不同的值集多次执行。

让我们看看另一个例子,它通过使用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 loop snippet

For 循环嵌套

一个显示嵌套for循环的示例。一个for循环嵌套在另一个for循环中,这意味着一个嵌套的for循环。让我们从一个示例开始。

  1. 创建矩阵MAT。(回顾教程矩阵)使用matrix()函数创建了一个包含1到6之间元素,两行三列的2×3矩阵。

     

    
    > MAT = matrix(1:6,2,3)
    > MAT
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    
    
  2. 创建一个嵌套for循环,打印矩阵中的每个行和列元素。请注意,这里我们使用seq_len()来生成序列,它获取通过其传递的参数的所需长度。seq_len(nrow(MAT)) 生成1 2行的序列,seq_len(ncol(MAT)) 生成1 2 3列的序列。
    
    
    #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程序中在矩阵中循环以打印矩阵内所有元素的完整源代码。

nested for loop img

图片展示了嵌套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循环

在R编程语言中,while循环是另一个主要的循环结构。while循环接受一个逻辑表达式,并根据逻辑表达式的验证结果执行循环。如果表达式或条件为真,则内部的代码块将被执行,否则在其他情况下将不执行。

while也是一个保留字,用于表示基本的控制流结构。

语法


While(condition){
     #perform some instructions
}

其中

  • 条件是验证为TRUE或FALSE的表达式
  • 如果为TRUE,则执行花括号内给出的代码。

示例


#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循环的流程图

while loop flowchart

for循环和while循环都具有类似的功能。但它们在以下原因上彼此不同

  • While 循环始终包含在运行循环之前定义的迭代器变量。但在 for 循环中,不需要初始化迭代器变量。

    例如,考虑显示数字1到10的简单代码,其中迭代器变量(i)的值在while循环执行之前初始化为1,即i=1。

    
    #while loop
    i=1
    while(i<=10){
      print(i)
      i=i+1
    }
    
    
  • 在while循环中,每当代码执行时,都会首先检查条件,这与for循环不同。在for循环中,条件只在循环体结束时检查;在while循环中,条件在循环体开始时检查。
  • 迭代器变量需要在while循环中每次递增。

    上面的代码显示1, 2, 3 …10的数字范围,其中迭代器变量i通过指令i=i+1递增。如果未提供i=i+1,则while循环最终将无限次地显示范围中的初始值。

所以你可以总结一下,在while循环中需要初始化和递增迭代器变量(i)

注意:通常,当我们比较差异时,for循环比while循环更高效。

R中的重复循环

一个repeat循环允许重复执行任何代码块。与其他的控制结构不同,repeat循环没有任何条件需要满足才能成功执行,因此也无法退出或终止任何循环。

程序员负责在控制结构(可能是for循环、while循环)内部提供退出条件,以退出执行,否则会导致无限循环。通常,控制结构内的break语句能够终止无限执行,以避免重复相同的代码。

语法


repeat { 
 #  instruction to execute
   ....
   .... 
   if(condition) {
      break
   }
}

repeat循环的流程图

repeatloop flowchart

使用重复语句的程序


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等。