记得刚开始学编程的时候,总有同学问我怎么学写循环,在一些人心中,入门和初级的R语言使用者的界限似乎就是能否熟练写循环或者函数,所以今天这个教程就是写的专门针对如何开始写循环。
从概念上讲,循环是在某些条件下重复执行一系列指令的一种方式。它们使您可以自动执行需要重复的代码部分。在深入研究R中的编写循环之前,很多人告诉我应该避免使用R中的循环。为什么?那是因为R支持向量化。简而言之,这R支持向量化可以加快计算速度。例如,写循环比函数(例如lapply和sapply)矢量化低。但是,作为R的初学者,对循环以及如何编写循环有一个基本的了解是很好的。
让我们回到循环的概念上。 假设您要进行以下形式的多个打印输出:年为[year],其中[year]等于2010、2011,到2015年。您可以按以下方式进行操作:
print(paste("The year is", 2010))
"The year is 2010"
print(paste("The year is", 2011))
"The year is 2011"
print(paste("The year is", 2012))
"The year is 2012"
print(paste("The year is", 2013))
"The year is 2013"
print(paste("The year is", 2014))
"The year is 2014"
print(paste("The year is", 2015))
"The year is 2015"
您立即看到这很繁琐:一遍又一遍地重复相同的代码块。 在这种情况下,通过在R中使用for循环,可以自动化重复部分:
for (year in c(2010,2011,2012,2013,2014,2015)){
print(paste("The year is", year))
}
"The year is 2010"
"The year is 2011"
"The year is 2012"
"The year is 2013"
"The year is 2014"
"The year is 2015"
理解for循环中发生的事情的最好方法是,按如下方式阅读:“对于序列c(2010,2011,2012,2013,2014,2015)中的每一年,您都执行代码块打印 (粘贴("The year is", year))”。 一旦for循环在向量中每年执行了代码块,循环就会停止并转到循环块之后的第一条指令。 您甚至可以进一步简化代码:c(2010,2011,2012,2013,2014,2015)也可以写为2010:2015; 这将创建完全相同的序列:
for (year in 2010:2015){
print(paste("The year is", year))
}
"The year is 2010"
"The year is 2011"
"The year is 2012"
"The year is 2013"
"The year is 2014"
"The year is 2015"
作为R中for循环的最后说明:在这种情况下,我们使用了变量year,但实际上这里可以使用任何变量。 例如,您可能在for循环中使用了i(代表索引的常用变量):
for (i in 2010:2015){
print(paste("The year is", i))
}
"The year is 2010"
"The year is 2011"
"The year is 2012"
"The year is 2013"
"The year is 2014"
"The year is 2015"
这将产生完全相同的输出。 因此,您可以随时随地为变量命名,但是如果您使用有意义的名称,则更易于理解。
让我们看一个更数学的例子。 假设您需要打印介于1到10之间的所有不均匀数字,但不应打印偶数。 在这种情况下,您的循环将如下所示:
for (i in 1:10) {
if (!i %% 2){
next
}
print(i)
}
1
3
5
7
9
当我在1到10之间时,我们进入循环,否则循环停止。万一进入循环,我们需要检查i的值是否不均匀。如果i的值除以2时余数为零(这就是为什么我们使用模数操作数%%的原因),则无需输入if语句,而是执行print函数并返回。如果余数不为零,则if语句的计算结果为TRUE,然后输入条件。现在,我们在这里看到下一条语句,该语句导致以1:10的条件循环回到i,从而忽略了随后的指令(即print(i))。