赞
踩
绝大多数编程语言,都有三种最基本的程序结构:顺序结构、分支结构、循环结构。这三种结构的流程图如下所示(从左至右依次为:顺序结构、分支结构、循环结构):
在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结构。
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就是FALSE
statements2 # 表达式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>0
y = 2
}else{ # 代码执行到此处,说明不满足x>=2和x>0,一定有x<0,所以此处无需判断
y = x - 5
}
print(y) # 此处在控制台打印y的值,结果为23
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。
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是循环计数变量,依次为序列中的每个值
}
while循环亦称当型循环,当条件满足时,就执行循环。其语法结构如下:
while(bool_expression){ # 当满足条件,就进入循环,每次执行完,都要进行一次判断
statements # 循环体,即重复执行的语句
}
程序例子如下:
# 模拟计算数字1-10的和
i = 1 # 声明变量i,并初始化为1
sum = 0 # 声明变量sum,并初始化为0
while(i <= 10){ # 当i<=10时,才会进入循环。每次循环执行完后,都要重新判断是否满足i<=10
sum = 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
}
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自增1
if(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循环。
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
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求余,结果理应为0
next # 如果是3的倍数,就跳过
sum = sum + i # 不是3的倍数,就求和
}
print(sum) # 打印sum的值,结果为3367
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。