前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >入门和初级R语言使用者的界限??

入门和初级R语言使用者的界限??

作者头像
用户1359560
发布2020-01-02 11:42:24
8930
发布2020-01-02 11:42:24
举报
文章被收录于专栏:生信小驿站生信小驿站

介绍

记得刚开始学编程的时候,总有同学问我怎么学写循环,在一些人心中,入门和初级的R语言使用者的界限似乎就是能否熟练写循环或者函数,所以今天这个教程就是写的专门针对如何开始写循环。

从概念上讲,循环是在某些条件下重复执行一系列指令的一种方式。它们使您可以自动执行需要重复的代码部分。在深入研究R中的编写循环之前,很多人告诉我应该避免使用R中的循环。为什么?那是因为R支持向量化。简而言之,这R支持向量化可以加快计算速度。例如,写循环比函数(例如lapply和sapply)矢量化低。但是,作为R的初学者,对循环以及如何编写循环有一个基本的了解是很好的。

在R中编写一个简单的for循环

让我们回到循环的概念上。 假设您要进行以下形式的多个打印输出:年为[year],其中[year]等于2010、2011,到2015年。您可以按以下方式进行操作:

代码语言:javascript
复制
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循环,可以自动化重复部分:

代码语言:javascript
复制
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; 这将创建完全相同的序列:

代码语言:javascript
复制
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(代表索引的常用变量):

代码语言:javascript
复制
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"

这将产生完全相同的输出。 因此,您可以随时随地为变量命名,但是如果您使用有意义的名称,则更易于理解。

使用next语句

让我们看一个更数学的例子。 假设您需要打印介于1到10之间的所有不均匀数字,但不应打印偶数。 在这种情况下,您的循环将如下所示:

代码语言:javascript
复制
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))。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 在R中编写一个简单的for循环
  • 使用next语句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档