R语言七天入门教程三:学习基本结构

一、编程的语言的基本结构
1、三种基本结构

绝大多数编程语言,都有三种最基本的程序结构:顺序结构、分支结构、循环结构。这三种结构的流程图如下所示(从左至右依次为:顺序结构、分支结构、循环结构):

2、语句块

在R语言中,一行代码会被识别为一条语句。代码之后无需结束符号。也可以用一行代码执行多条语句,每条代码之间用分号;分隔。(不推荐,一行代码执行多条语句,会影响代码可读性)

R中用大括号{ }将代码块包围,作为一个整体,即一个语句块。通常对于同一个语句块内的代码,采用相同的缩进。代码缩进对程序运行没有影响,但影响可读性,一般缩进2个空格。对于分支结构中的分支、循环结构中的循环体,都会采用缩进来提高代码可读性。

二、顺序结构

顺序结构是最基础最常用的结构,由流程图可以看出:对于顺序结构而言,语句按照其在程序中出现的先后顺序依次执行。先执行语句1,然后执行语句2,语句3,…,语句n。程序例子如下:

# 下面这段代码演示了如何交换两个变量的值
a = 10 # 声明变量a,并初始化为10
b = 5 # 声明变量b,并初始化为5
tmp = a # 声明变量tmp, 并将a的值赋给它,此时tmp的值为10
a = b # 将b的值赋给变量a,此时a的值为5
b = tmp # 将tmp的值赋给变量b,此时b的值为10
# 请思考:为什么要使用临时变量tmp,直接用如下语句是否可行?
# a = b
# b = a
三、分支结构

在分支结构中,程序有多个分支,会根据当前的条件来选择其中一个分支来执行。从流程图可以看出:当满足判断条件时,就执行语句块1(分支1)和语句块3;不满足条件时,就执行语句块2(分支2)和语句块3。在R语言中,有两种分支结构:if-else结构,和switch结构。

1、if-else语句(更推荐使用)

if-else语句的语法结构如下:

if(bool_expression) { # 判断条件是一个布尔表达式,其值要么为真,要么为假statements1 # 表达式为真,就执行此处
}else {statements2 # 表达式为假,就执行此处
}

if-else语句中的else部分可以省略,如下:

if(bool_expression) { # 判断条件是一个布尔表达式,布尔表达式通常含有关系运算符或者比较运算符statements1 # 表达式为真,就执行此处
}

if-else语句还可进行嵌套,如下:

if(bool_expression1) { # 判断条件1是一个布尔表达式,R语言中数值也可用于布尔表达式statements1 # 表达式1为真,就执行此处
}else if(bool_expression2) { # 判断条件2是一个布尔表达式,非0为TRUE, 0就是FALSEstatements2 # 表达式1为假且表达式2为真,就执行此处
} else {statements3 # 表达式1和表达式2均为假,就执行此处
}

程序例子如下:

# 模拟分段函数:当x>=2时,y = 2x+3;当0<x<2时,y = 2;当x<=0时,y= x-5
x = 10 # 声明变量a,并初始化为10
if(x>=2) { y = 2*x + 3 # 对应x>=2
} else if(x > 0) { # 代码执行到此处,说明不满足x>=2,一定有x<2,所以此处只需判断x>0y = 2
}else{ # 代码执行到此处,说明不满足x>=2和x>0,一定有x<0,所以此处无需判断y = x - 5
}
print(y) # 此处在控制台打印y的值,结果为23
2、switch语句

switch语句用于多个值匹配的场景,相当于对多重if-else语句进行了简化,但不如if-else直观。其语法结构如下:

switch(expresseion, case1, case2, case3, ..., casen)

括号中的第一项是一个表达式,其值可以是整数或者字符串。当值为整数时,就返回对应位置的case,如果值不在case的位置范围内,就返回NULL。当值为字符串时,就返回与之匹配的第一个case,如果没有匹配的case,就返回NULL。

整数对应的程序例子如下:

# 模拟根据不同的排名给予不同的奖励,第一名1000元,第二名500元,第三名300元
rank = 1 # 声明变量rank,并初始化为1
award = switch(rank, '1000RMB', '500RMB','300RMB') # 声明变量award,并根据rank的值来进行初始化
print(award) # 此处在控制台打印award,结果为'1000RMB', 如果rank的值不在1,2,3中,就会打印NULL

字符串对应的程序例子如下:

# 模拟根据不同的关键字生成官网网址
word = 'baidu'  # 声明变量word,并初始化为'baidu'
web_url = switch(word, 'weibo'='www.weibo.com', 'baidu'='www.baidu.com','tencent'='www.tencent.com') # 声明变量web_url,并根据word的值来进行初始化
print(web_url) # 打印web_url,结果为'www.baidu.com', 如果word的值不在'weibo','baidu','tencent'中,就会打印NULL
四、循环结构

对于循环结构,指的是在程序运行过程中,如果满足某一条件,就会重复执行一段代码若干次。从流程图可以看出:当满足判断条件时,就执行语句块1(循环体);如果不满足,就直接执行语句块2。每次执行完语句块1后,都要再次判断是否满足循环条件,如果满足,就继续执行语句块1;如果不满足,就退出循环执行语句块2。

1、for循环

for循环最为简洁直观,可用于遍历序列或者循环执行代码。其语法结构如下:

for(value in sequence){ # 遍历sequence中的每一个值,循环执行次数为sequence的长度statements # 循环体,即重复执行的语句
}

程序例子如下:

# 模拟打印数字1-10的平方
for(i in 1:10){ # 1:10表示起始值为1、结尾值为10、且间隔为1的序列,即1, 2, 3, ..., 10,所以会循环10次print(i*i) # 打印i的平方,i是循环计数变量,依次为序列中的每个值
}
2、while循环

while循环亦称当型循环,当条件满足时,就执行循环。其语法结构如下:

while(bool_expression){ # 当满足条件,就进入循环,每次执行完,都要进行一次判断statements # 循环体,即重复执行的语句
}

程序例子如下:

# 模拟计算数字1-10的和
i = 1 # 声明变量i,并初始化为1
sum = 0 # 声明变量sum,并初始化为0
while(i <= 10){ # 当i<=10时,才会进入循环。每次循环执行完后,都要重新判断是否满足i<=10sum = sum + i # 求和i = i + 1 # i自增1,这一步很重要,不然i的值就一直是初始化的1了
}
print(sum) # 打印sum的值,结果为55

在while循环中,还存在一种特殊的循环,称为死循环,即循环判断条件始终为真。死循环会导致程序一直执行循环体,造成卡死的现象。一般来说,应该尽量避免死循环;但在特殊情况下,也可以用死循环来监听用户的输入。程序例子如下:

# 模拟死循环
i = 10 # 声明变量i,并初始化为10
while(i){ # 由于i的值是10,会被当作TRUE来处理,所以会陷入死循环print(i) # 将会在控制台一直打印10
}
3、repeat循环

repeat循环可以理解为直到型循环,直到满足某个条件时,就退出循环。其语法结构如下:

repeat{ statements # 循环体,即重复执行的语句,在repeat循环中至少执行一次if(bool_expression) # 当表达式为真时,结束循环break  # break是一个关键字,用于结束当前循环。当if语句中的分支只有一条语句时,可以省略{}
}

程序例子如下:

# 模拟计算数字1-100内所有奇数的和
i = 1 # 声明变量i,并初始化为1
sum = 0 # 声明变量sum,并初始化为0
repeat{if(i%%2 == 1){ # 除以2,余数为1,说明是奇数sum = sum + i # 求和}i = i + 1 # i自增1if(i > 100) # 当i>100时,退出循环break
}
print(sum) # 打印sum的值,结果为2500

当然,如果把i自增1改为i自增2,代码还可以进一步简化:

# 模拟计算数字1-100内所有奇数的和
i = 1 # 声明变量i,并初始化为1
sum = 0 # 声明变量sum,并初始化为0
repeat{if(i > 100) # 当i>100时,退出循环break # 请思考:这里为什么要先判断是否退出循环,再进行求和?sum = sum + i # 求和i = i + 2 # i自增2
}
print(sum) # 打印sum的值,结果为2500

注:repeat循环中如果漏掉了break关键字,也会陷入死循环。所以,更推荐在R语言中使用for循环和while循环。

4、break关键字

break是R语言中的一个关键字,可以写在循环体中的任意位置,用于结束当前循环。当出现循环嵌套时,需要分清break所在的位置。

程序例子如下:

# 模拟找出等差数列{1,7,13,19,...}中小于100的最大的数
i = 1 # 声明变量i,并初始化为1
while(i < 100){ # 当i<100时,才执行循环if (i + 6 >= 100) # 当前数小于100,如果下一个数大于等于100,则说明当前数为小于100的最大的数break # 退出循环i = i + 6 # i自增6
}
print(i) # 打印i的值,结果为97
5、next关键字

next关键字用于跳过当前循环,开始下一次循环流程。和break一样,next也可以写在循环体中的任意位置。对于while循环而言,下一次循环流程为:先判断循环条件是否满足,再执行循环体。对于repeat循环而言,下一次循环流程为:先执行循环体,再判断循环退出条件是否满足。

程序例子如下:

# 模拟计算1-100内所有非3的倍数的和
i = 1 # 声明变量i,并初始化为1
sum = 0 # 声明变量sum,并初始化为0
for(i in 1:100){ # 遍历1-100的每一个数if(i%%3==0) # 3的倍数对3求余,结果理应为0next # 如果是3的倍数,就跳过sum = sum + i # 不是3的倍数,就求和
}
print(sum) # 打印sum的值,结果为3367

R语言七天入门教程三:学习基本结构相关推荐

  1. R语言七天入门教程二:认识变量与运算符

    R语言七天入门教程二:认识变量与运算符 一.什么是变量 1.变量 顾名思义,我们可以将变量理解为"可以改变的量",是计算机语言中能储存计算结果或能表示值的抽象概念.这里的值可以是数 ...

  2. R语言七天入门教程六:文件相关操作

    R语言七天入门教程六:文件相关操作 一.文件的读写 R 语言作为统计学编程语言,常常需要处理大量数据,而这些数据通常会从文件中进行读取,因此文件读写在R语言中是非常重要的操作.在R语言中,用到最多的文 ...

  3. R语言七天入门教程五:认识并使用函数

    R语言七天入门教程五:认识并使用函数 一.什么是函数 在编程语言中,如果有一段代码需要在多次重复使用,除了复制粘贴外,还可以将其写成一个函数.函数可以很方便地实现代码复用,对于复杂的程序功能,可以将其 ...

  4. R语言七天入门教程一:配置运行环境

    R语言七天入门教程一:配置运行环境 一.R语言介绍 1.R语言是什么? 参考:R语言教程-R语言介绍 R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析.绘图.数据挖掘.R语言有丰富的 ...

  5. R语言 零基础入门教程第11章 Rattle可视化数据挖掘工具(1)Rattle简介及安装 功能预览 数据导入 数据探索 数据建模 模型评估 Rattle实例

    关注公众号凡花花的小窝,收获更多的考研计算机专业编程相关的资料 本章内容 Rattle简介及安装 功能预览 数据导入 数据探索 数据建模 模型评估 Rattle实例 本章目标 了解Rattle的安装及 ...

  6. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

     深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening 主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通 ...

  7. R语言基础知识入门学习(一)

    目录 系列文章目录 一.软件下载 二.基本知识 1. 对象 2. 向量 3. 向量化 4. 因子 总结 系列文章目录 R语言基础知识入门学习(一) 一.软件下载 我们可以通过这个网址对R语言软件进行下 ...

  8. (生物信息学)R语言与统计学入门(七)—— 一元线性回归分析

    我们之前讲过相关性分析,生物信息学常见的相关性分析是pearson相关和spearman相关. (生物信息学)R语言与统计学入门(六)-- Pearson和Spearman相关性分析_Lijingxi ...

  9. 大数据分析R语言tidyverse数据清洗工具教程

    凌乱的数据集无处不在.如果要分析数据,不可避免地需要清理数据.在大数据分析R语言tidyverse数据清洗工具教程中,我们将研究如何使用R和一些漂亮的tidyverse工具来做到这一点. 该tidyv ...

最新文章

  1. 异步委托实现多线程winform控件编程
  2. 超越RMI,高效Java remote调用
  3. Windows下安装Python扩展模块提示“Unable to find vcvarsall.bat”的问题(转载)
  4. OpenStack Days走进北京 主角是用户
  5. .sql文件如何执行_随手记 02 日志系统:一条SQL更新语句是如何执行的?
  6. 列Readonly的问题
  7. Ajax跨域请求以及乱码解决
  8. SDS趋势之二:对象存储将替代文件存储
  9. TensorFlow 学习指南 二、线性模型
  10. XSS-Game Level 4
  11. 博文视点大讲堂28期 “助你赢在软件外包行业”成功举办
  12. Spring注解驱动开发-----容器day01
  13. svn linux版本下载,linux 下安装 subversion(svn) 客户端
  14. matlab 二元函数的画法
  15. ln -s 一定要用绝对路径
  16. 回归问题中代价函数选择的概率解释(Probabilistic interpretation)
  17. Java利用poi-tl实现富文本HTML转Word
  18. 计算机终端维护组织结构,信息部组织架构及人员编制 Manning GuideOrganization Chart...
  19. 发票管理小工具(三):PDFMiner vs pdfminer3k vs Pdfminer.six
  20. ks 曲线_关于模型检验的ROC值和KS值的异同_ROC曲线和KS值

热门文章

  1. 如何打造一个成功的MES系统,我们又需要注意些什么?
  2. 字节跳动国际化电商日常实习面经汇总(一二三四面 已OC)
  3. Spark 机器学习 概括统计 summary statistics [摘要统计]
  4. Java通过字节流获取图片类型
  5. 骑砍服务器文件夹,骑马与砍杀2东亚决斗服服务器密码 决斗服服务器密码是多少...
  6. 计算机科学导论阅读笔记
  7. 梯度下降算法分类总结
  8. 微信小程序API-设备-系统信息
  9. 如何将pdf压缩到1m以下或以内?怎么把pdf压缩到2m以下或以内?
  10. 海豚浏览器前端面试总结