64.1 实验目的
1. 理解程序的逻辑结构;
2. 理解分支结构;
3. 理解循环结构。
64.2 实验要求
1. 掌握分支结构;
2. 掌握循环结构。
64.3 实验原理
流程控制是存在于所有计算机语言里的基本概念,指在程序运行时,个别的指令执行或求值的顺序。一段程序有三种基本的控制结构,分别是顺序结构、分支结构和循环结构。程序语句由上到下逐行执行,便是顺序结构;分支结构是程序根据判断条件选择性地执行部分语句;循环结构是指同一个语句组根据一定的条件执行若干次。下面我们学习在R语言里,如何运用分支结构和循环结构。
64.3.1 分支结构
64.3.1.1 if语句
if语句由一个布尔表达式后跟一个或多个语句组成。
语法:
if(boolean_expression) { // 当boolean_expression为真时执行的代码 }
64.3.1.2 if...else语句
if语句后面可以有一个可选的else语句,当布尔表达式为false时执行。
语法:
if(boolean_expression) { //当boolean_expression为真时执行的代码 } else { //当boolean_expression为假时所执行的代码 }
64.3.1.3 switch语句
switch语句允许根据值列表测试变量的相等性。
以下规则适用于switch语句:
1. 如果expression的值不是字符串,那么它将被强制转为整数。
2. 在交换机中可以有任意数量的case语句。 每个案例后面都跟要比较的值和冒号。
3. 如果如果表达式求值为整数且值在1和nargs() - 1(参数的最大数目)之间,则对case条件的相应元素求值并返回结果。
4. 如果表达式求值为字符串,那么该字符串与元素的名称匹配。
5. 如果有多个匹配,则返回第一个匹配元素。
6. 无默认参数可用。
7. 在没有匹配的情况下,如果存在一个未命名的元素,那么该元素的值将被返回。(如果有多个这样的参数,则返回错误。)
语法:
switch(expression, case1, case2, case3....)
64.3.2 循环结构
64.3.2.1 repeat循环
多次执行同一代码块,直到满足停止条件。
语法:
repeat { commands if(condition) { break } }
break关键字表示跳出循环,即结束循环。
64.3.2.2 while循环
在给定条件为真时,重复语句或语句组。它在执行循环体之前测试条件。
语法:
while (test_expression) { statement }
while循环的关键点是循环可能永远不会执行。 当条件被测试并且结果为false时,循环体将被跳过,while循环之后的第一条语句将被执行。
64.3.2.3 for循环
像while语句一样,不同之处在于它在循环体结尾测试条件。
语法:
for(test_expression) { statement }
R的for循环是特别灵活的,因为它们不限于整数,或者输入中的偶数。 我们可以传递字符向量,逻辑向量,列表或表达式。
64.4 实验步骤
启动实验后,登录master服务器,使用vi编辑器编写以下脚本。
64.4.1 编写if及if-else语句测试程序
编写R语言if及if-else测试程序if.R,在vi编辑器中键入如下代码:
#!/usr/bin/env Rscript # 读取命令行参数 args<-commandArgs(T) # 读取的参数默认为string类型,此处需要转换,如果不是数字会产生NA值 a = as.numeric(args[1]) b = as.numeric(args[2]) # 先判断两个数字是否是整数,再对两个数进行大小比较 if(!is.na(a) && !is.na(b)) { if(a < b) print( "a is less than b" ) if(a == b) print( "a is equal to b" ) if(a > b) print( "a is greater than b" ) }else { print("Arguments should be two integers!Try it again.") }
键入完成后,保存退出。
64.4.2 运行if及if-else语句测试程序
在master服务器上执行如下命令,运行R语言if及if-else语句测试程序。大家设置参数时可以尝试其它输入,下面为示例输入参数为100和200:
Rscript if.R 100 200
64.4.3 编写switch语句测试程序
编写R语言switch语句测试程序switch.R,在vi编辑器中键入如下代码:
#!/usr/bin/env Rscript # 读取命令行参数 args<-commandArgs(T) # 读取的参数默认为string类型,此处需要转换,如果不是数字会产生NA值 a = as.numeric(args[1]) x = switch( a, "first", "second", "third", "fourth" ) print(x)
键入完成后,保存退出。
64.4.4 运行switch语句测试程序
在master服务器上执行如下命令,运行R语言switch语句测试程序。大家设置参数时可以尝试其它输入,下面为示例输入参数为3:
Rscript switch.R 3
64.4.5 编写repeat语句测试程序
编写R语言repeat语句测试程序repeat.R,在vi编辑器中键入如下代码:
#!/usr/bin/env Rscript i = 2 v = "hello, world" repeat { print(v) i = i+1 if(i > 5) { break } }
键入完成后,保存退出。
64.4.6 运行repeat语句测试程序
在master服务器上执行如下命令,运行R语言repeat语句测试程序。
Rscript repeat.R
64.4.7 编写for和while循环语句测试程序
编写R语言流程控制程序for_while.R,在vi编辑器中键入如下代码:
#!/usr/bin/env Rscript # 测试for循环语句 print('------------for-------------') a = list( 1 : 3 ) for( i in a ){ print( i ) } # 测试while循环语句 print('------------while-------------') i = 0 while (i < 10) { print(i) i = i + 1 }
64.4.8 运行for和while循环语句测试程序
在master服务器上执行如下命令,运行R语言for和while循环语句测试程序。
Rscript for_while.R
64.5 实验结果
64.5.1 if.R运行结果
if及if-else语句测试程序运行结果如下所示:
图64-1 if.R运行结果
64.5.2 switch.R运行结果
switch语句测试程序运行结果如下所示:
图64-2 switch.R运行结果
64.5.3 repeat.R运行结果
repeat语句测试程序运行结果输出如下所示:
图64-3 repeat.R运行结果
64.5.4 for_while.R运行结果
for和while循环语句测试程序运行结果输出如下所示:
图64-4 for_while.R运行结果