R语言 控制流:for、while、ifelse和自定义函数function | 您所在的位置:网站首页 › r语言if函数自循环 › R语言 控制流:for、while、ifelse和自定义函数function |
行列引用、条件筛选等可以简单的数据管理,但其在无法有效处理多次、多重、有规律的循环和判断问题,而控制流却可以通过循环、判断、跳错等等操作轻松处理此类问题。 以下概念贯穿控制流张杰的内容,需要首先认识: 语句(statement):单独或组合语句,一般在{}中以;分隔 。例如:{语句1;语句2} 条件(cond): 最常见的是判断一个条件是否成立。如果成立则执行一条语句或者一个代码块,比如上例a是否小于b,如果小于则输出b 表达式(expr):一个数值或字符的求值语句,多用于数据计算过程或赋值序列(seq):一个数值或者字符序列目录 1 分支控制 1.1 if-else 1.2 ifelse 1.3 switch 2 循环控制流 2.1 for循环 2.2 while循环 2.3 repeat 循环 3 function函数(一次编写,多次调用,一劳永逸) 3.1 自定义函数编写 3.2 source()文件间调用自定义函数 分支和循环是通用编程语言中常见的两大控制流。其中,分支控制是根据条件表达式的结果,执行不同的代码段;循环控制是根据条件重复执行代码块,为了避免无限循环,可以根据条件结束循环。接下来分别从分支控制和循环控制,对R语言中的控制流做简单讲述。 正文 1 分支控制 1.1 if-else 经典的流程控制关键字是if-else,并可以把多个if-else语句连接到一起 #if-else分支控制流语法 if ( test_expression1) { statement1 } else if ( test_expression2) { statement2 } else { statement3 }示例 #嵌套用法 > a=5 > b=6 > if (a < b) {a ifelse(x %in% c("a", "b", "c"), x, factor(NA)) [1] 1 1 3 NA 1 2 NA 2 NA NA注意:返回值的class属性跟test表达式相同,其mode属性是由 yes 或 no表达式确定的。当ifelse()用于返回Date类型的对象时,返回值是numeric类型,而不是Date类型,这是因为返回值的class是由test表达式决定的。 > dates dates [1] "2011-01-01" "2011-01-02" "2011-01-03" "2011-01-04" "2011-01-05" > dates dates [1] 14974 14976 14977 14978 14979 #解决方案是:把返回值的class重新设置为Date类型。 > dates dates [1] "2011-01-01" "2011-01-02" "2011-01-03" "2011-01-04" "2011-01-05" > dates dates [1] 14974 14976 14977 14978 14979 > class(dates) dates [1] "2010-12-31" "2011-01-02" "2011-01-03" "2011-01-04" "2011-01-05"1.3 switch 如果分支较多,可以使用switch函数实现分支的选择,switch函数的第一个参数是表达式(exp),通常是一个字符串。当表达式(exp)匹配后续的参数名(即变量名)时,返回参数的值 #switch语法 switch(字符,参数名1='参数值2',参数名2='参数值2',……"其他")示例 #当表达式(exp)匹配后续的参数名(即变量名)时,返回参数的值 > t = "r" > switch(t,r='re',g='gr',b='bl',"error") [1] "re" #如果不匹配任何参数名,switch函数不返回任何值,可以添加一个匿名的参数, #当表达式(exp)匹配不上任意一个命名参数时,switch函数将返回匿名参数的值: > t = "xs" > switch(t,r='re',g='gr',b='bl',"error") [1] "error"2 循环控制流 repeat、while和for是常见的循环控制语句。 2.1 for循环 使用迭代器和一个向量参数,在每个循环中,迭代器变量从向量中取得一个值,直到迭代所有得向量 #语句 for (变量 in 序列/字符集) {语句/表达式}示例 #依次执行序列/字符集中的每一个数据+print语句 > for (i in 1:5) print(letters[i]) [1] "a" [1] "b" [1] "c" [1] "d" [1] "e" #依次执行序列/字符集中的每一个数据+表达式+print语句 > for (i in 1:5) {j = j + i; print(c(i,j))} [1] 1 1 [1] 2 3 [1] 3 6 [1] 4 10 [1] 5 15 > j = 0 > for (i in 1:5) {j = j + i; print(c(i,j))} [1] 1 1 [1] 2 3 [1] 3 6 [1] 4 10 [1] 5 15 > print(j) [1] 152.2 while循环 先检测条件,如果条件为TRUE,执行code;如果条件为FALSE,结束循环 #语句 while (条件) {语句/表达式} #条件为TRUE,执行语句/表达式;否则终止跳出示例 > i=5 > while (i >0) {j = i; i=i-1 ; print(c(j,i))} [1] 5 4 [1] 4 3 [1] 3 2 [1] 2 1 [1] 1 02.3 repeat 循环 repeat 循环:先执行代码,遇到break关键字,结束循环 repeat {code if(条件) break}示例 > i=100 > sum=0 > repeat + { + if(i==0) + break + sum=i+sum + i=i-1 + } > print(sum) [1] 50503 function函数(一次编写,多次调用,一劳永逸) 3.1 自定义函数编写 R通过function关键字定义函数,函数主要由函数名称,参数,运行的代码块和返回值组成,函数名称是变量,参数是调用函数时需要传递的形式参数;代码块是由由大括号构成,是调用函数时需要执行的代码逻辑;R的函数不需要显式地使用return关键字明确返回值,R函数的计算的最后一个值将自动作为返回值。 #语法 myfunc=function(arg1,arg2,....) #参数 { 表达式/循环/print语句等 return(object) #返回输出的对象 }示例1:简单计算 > avg avg(4,5) [1] 4.5 > avg avg(4,5) [1] 4.5示例2:矩阵计算 > mat1 mat2 f |
CopyRight 2018-2019 实验室设备网 版权所有 |