R语言基础系列前情提要:

  • 1数据类型(向量、数组、矩阵、 列表和数据框)

  • 2读写数据所需的主要函数、与外部环境交互

  • 3数据筛选——提取对象的子集

  • 4:向量、矩阵的数学运算

Control Structures in R

R语言中控制结构可以用来控制程序的执行流程

常见控制结构的命令:

  • if and else: 测试逻辑条件

  • for: 用于执行固定次数的循环

  • while: 用于在某个条件成立时执行循环

  • repeat: 执行无限循环

  • break: 终止并跳出循环

  • next: 跳过循环中的当前迭代

  • return: 从函数中退出

If-else

如果条件成立,程序就做某件事

否则(另一种条件下)。程序做另一件事

if(<condition>) {## do something
}
else {## do something else
}

Else不是必须的,如果只需要在某条件成立时执行某个任务,那么只要使用if语句就可以了

if(<condition>) {## do something
}
## Continue with rest of code

如果条件不止一个/不止两个的时候,可以添加一个/多个 elseif语句,但最后必须以 else结尾:

if(<condition1>) {## do something
} else if(<condition2>)  {## do something different
} else {## do something different
}

取随机数字举例,y的取值随x的取值而定:

## Generate a uniform random number
x <- runif(1, 0, 10)
x
if(x > 3) {y <- 10
} else {y <- 0
}

上面的代码也可以写成下面的形式,先给变量y赋值,这种写法的好处是更加明确的看出整个if结构是在给y赋值:

y <- if(x > 3) {10
} else { 0
}

For 循环(For loop)

for循环是R中最常见的循环运算符,基本思路是先要设定一个循环下标,通常命名为 i,循环下标通常会代表一个整数数列中的每一个数字,或列表中的每一个对象等等。

最简单的例子如下,运行后将依次输出1-10这十个整数:

for(i in 1:10) {print(i)
}

依次打印x中的每一个元素,运行后就会依次输出 "a", "b", "c", "d"四个字符对象:

  • 第一种方法是将循环向量和向量x的长度相对应:

x <- c("a", "b", "c", "d")
for (i in 1:4) {print(x[i])
}
  • 第二个方法,使用 seq_along()函数,即,输入一个向量,之后它就会创造一个与该向量等长的整数数列。因此上面的例子可以改写成,在我们不知道x的向量长度时,可以使用这种写法:

x <- c("a", "b", "c", "d")
for (i in seq_along(x)) {print(x[i])
}
  • 第三个方法,下标变量 letter,这个变量的本意就是一个下标,会从向量本身取值,它可以从任意向量中提取元素,因此可以写成:

x <- c("a", "b", "c", "d")
for (letters in x) {print(letters)
}

ps. 如果你的for循环表达式只有一行,那么可以省略掉大括号 {},直接写道 for的后面:

for (letters in x) print(letters)

嵌套for循环(Nested for loop)

把一个for循环放到另一个for循环的里面。

比如,有一个二维矩阵,你想先做一个行循环,再做一个列循环,这时就需要做一个嵌套for结构才能打印出所有矩阵中的元素。

我们设置 i为外层循环下标, j为内层循环下标:

> x <- matrix(1:6, 2, 3)
> x[,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> for (i in seq_len(nrow(x))) {
+ for (j in seq_len(ncol(x))) {
+ print(x[i,j])
+ }
+ }
[1] 1
[1] 3
[1] 5
[1] 2
[1] 4
[1] 6

While 循环

While循环有一个逻辑表达式,循环是按照这个逻辑表达式的值来反复运行的。

举个栗子,

设定一个计数标量 count,初始值为0,当技术变量的值小于10(逻辑表达式)时,运行输出变量 count就在之前的基础上 +1,一旦 count的值达到10,循环停止

count <- 0
while(count < 10) {print(count)count <- count + 1
}

注意:你需要确保逻辑循环表达式的值是可以达到终止状态的,否则就会无穷无尽的循环下去。

使用逻辑运算符

再举个栗子,设计一个小型随机游走的程序:

首先赋值z=5,然后运行while循环,当z处于3~10中间时,进入循环,循环中抛硬币,硬币是随机数1和0.5,在嵌入if循环,z的值会根据硬币取值变化而变化,结束时间不定。

z <- 5
while (z >= 3 && z <= 10) {coin <- rbinom(1, 1, 0.5)if(coin == 1) {  ## random walkz <- z + 1} else {z <- z - 1}
}

repeat循环

这是一个无限循环结构,退出的方法是 break(在某个点强制退出)。

比如,当你想计算两个值何时达到无限接近,需要通过算法不断循环,直到逼近你设置的容差(允许范围)

x0 <- 1
tol <- 1e-8
repeat {x1 <- computeEstimate()if(abs(x1 - x0) < tol) {  ## Close enough?break} else {x0 <- x1}
}

(这里的 computeEstimate()是需要事先设定的,如果这有这段这个代码的话跑不通)

注意,repeat循环风险很大,因为没硬性规定何时退出,有可能运行时间非常长,所以不建议直接使用

break函数

break用来完全退出循环

for(i in 1:100) {print(i)if(i > 20) {## Stop loop after 20 iterationsbreak  }
}

next和return函数

nextreturn函数是一种控制结构。

next可用在任何一种循环中,跳过某一段循环。例如,在1-100的迭代循环中,想要跳过前20个,可以用这种方式:

for(i in 1:100) {if(i <= 20) {## Skip the first 20 iterationsnext                 }## Do something here
}

return主要用于退出函数,它会结束整个函数并且返回一个数值。

最后,Peng提到,这些控制结构最好用于编写程序的过程中,而在命令行和交互作用来说有其他的循环函数,如apply()等一系列函数,这些在这里暂且不提,以后会讲到。

参考资料:

  1. https://bookdown.org/rdpeng/rprogdatascience/R Programming for Data Science

  2. 《R语言实战》 Robert I. Kabacoff

快快和我一起上车,请关注:生信小白学习记

猜你喜欢

  • 热文:1高分文章 2不可或缺的人 3图表规范

  • 一文读懂:1微生物组 2寄生虫益处 3进化树

  • 必备技能:1提问 2搜索  3Endnote

  • 文献阅读 1热心肠 2SemanticScholar 3geenmedical

  • 扩增子分析:1图表解读 2分析流程 3统计绘图  4功能预测

  • 科研经验:1云笔记  2云协作 3公众号

  • 系列教程:1Biostar 2微生物组  3宏基因组

  • 生物科普 1肠道细菌 2人体上的生命 3生命大跃进  4细胞的暗战 5人体奥秘

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外1300+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍末解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

R语言笔记5:控制结构相关推荐

  1. R语言笔记1:t检验和Wilcoxon检验

    转自新浪博客,转载地址:http://blog.sina.com.cn/s/blog_427c24ae0102wg7n.html 1.t检验 数据是高血压患者治疗前后舒张压的变化,这个内容最熟悉不过了 ...

  2. R语言笔记4_模型诊断(关于残差)

    R语言笔记4_模型诊断(关于残差)及模型补救(Box-Cox变换) 文章目录 R语言笔记4_模型诊断(关于残差)及模型补救(Box-Cox变换) 检验线性关系 检验方差齐性 检验残差正态性 检验离群值 ...

  3. R语言笔记——”org.Hs.eg.db“脱坑记录

    R语言笔记--"org.Hs.eg.db"脱坑记录 "org.Hs.eg.db"是发布在bioconductor平台上面的一个数据库文件,该包中装有较多的主流数 ...

  4. R语言笔记8:两个重要函数——用来分解数据框的split和用来查看对象的str

    R语言基础系列: 你知道R中的赋值符号箭头(<-)和等号(=)的区别吗? 1数据类型(向量.数组.矩阵. 列表和数据框) 2读写数据所需的主要函数.与外部环境交互 3数据筛选--提取对象的子集 ...

  5. R语言笔记7:认识循环函数、lapply和sapply

    R语言基础系列: 你知道R中的赋值符号箭头(<-)和等号(=)的区别吗? 1数据类型(向量.数组.矩阵. 列表和数据框) 2读写数据所需的主要函数.与外部环境交互 3数据筛选--提取对象的子集 ...

  6. R语言笔记6:在R中写一些简单的函数、functions基础和作用域

    R语言基础系列: 1数据类型(向量.数组.矩阵. 列表和数据框) 2读写数据所需的主要函数.与外部环境交互 3数据筛选--提取对象的子集 4向量.矩阵的数学运算 5控制结构 Your first R ...

  7. R语言笔记1:数据类型(向量、数组、矩阵、 列表和数据框)

    宏基因组按:科研中数据分析解读占用了我们太多时间,学习R语言是生物测序领域数据(reads count表)分析及可视化的首选.举个例子,扩增子分析从fastq到OTU表至多是de novo或refer ...

  8. R语言笔记-R语言数据挖掘方法及应用--1

    参考-<R语言数据挖掘方法及应用>-薛薇,学习笔记 --1---------------------------------------------- search() 当前工作区间加载了 ...

  9. R语言笔记4:向量、矩阵的数学运算

    R语言基础系列前情提要: 1数据类型(向量.数组.矩阵. 列表和数据框) 2读写数据所需的主要函数.与外部环境交互 3数据筛选--提取对象的子集 Vectorized Operations R中许多操 ...

最新文章

  1. 输入的命令集锦(补充)
  2. 线性代数的本质 - 02 - 线性组合、张成的空间与基
  3. 特征选择与特征权重区别
  4. 上海应用物理所计算机,【中国科学报】上海应用物理所建立组合学原理DNA计算器原型...
  5. Oracle12c:安装后新建用户及其默认表空间,并创建表测试
  6. mysql自增id获取失败
  7. 计算机一级windows7操作,计算机等级一级:Windows7应用之小技巧
  8. 互联网晚报 | 2月25日 星期五 | 元宇宙概念,热度显著下降;​腾讯正洽谈落地“东数西算”大湾区枢纽韶关数据中心集群...
  9. pydev导入eclipse
  10. 鸿海集团否认郭台铭辞任董事长:只是希望退居二线
  11. 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼
  12. Python之定义可变参数
  13. 沙盘推演具体包括哪些内容
  14. 毕业论文排版素材大学计算机基础,毕业论文排版素材大学计算机基础实验.pdf...
  15. 刚刚搬进公寓,应该每个月交100块网费好还是买个随身WiFi?
  16. Vue项目H5移动端在线预览PDF文件
  17. 服务器换主板不换系统教程,主板要换,系统不变
  18. 线控转向,包含设计说明书,carsim模型,MATLAB Simulink模型全套
  19. Java项目:医药进销存系统(java+SSM+JSP+Layui+jQuery+Maven+mysql)
  20. oracle数据库scn是什么

热门文章

  1. 阿里某员工:发完年终奖后就离职,工作让我心力交瘁
  2. 推荐8个可以显著提高工作效率的办公神器
  3. 电脑族必备的6款神器,第1个都让人惊艳了!
  4. 飞书携手问卷网并肩抗“疫”,助力疫情信息申报收集工作
  5. 关于技术方案与架构宣讲的思考
  6. 云原生架构演进与企业上云
  7. OKR能带来哪些价值?
  8. Q-learning
  9. 结构体类型、联合体类型
  10. 23CSS3中的2D转换