[关闭]
@evilking 2018-03-03T16:04:51.000000Z 字数 3412 阅读 1579

R基础篇

程序控制

程序控制如选择、循环等是每种语言必备的部分,R是一种块状结构程序语言,想想C风格就知道了;块由大括号划分,当块只包含一条语句时大括号可以省略;程序语句由换行符或者分号分隔

最后会补充介绍一下R语言中基本的运算符,以及运算符的优先级

条件选择语句

> if( 3 > 1) print("大于")  #if条件成立时
[1] "大于"

> if( 3 < 1) print("小于")  #if条件不成立时

> if(3 > 1) print("大于") else print("小于")   #if-else的用法
[1] "大于"

> if(3 < 1) print("大于") else print("小于")
[1] "小于"
>
> arg <- 7  #使用if-else if-else的情况
> if(arg > 5){
+   print("参数大于 5")
+ }else if(arg > 3){
+   print("参数大于 3")
+ }else{
+   print("参数小于等于 3")
+ }
[1] "参数大于 5"

> arg <- 4
> if(arg > 5){
+   print("参数大于 5")
+ }else if(arg > 3){
+   print("参数大于 3")
+ }else{
+   print("参数小于等于 3")
+ }
[1] "参数大于 3"

> arg <- 3
> if(arg > 5){
+   print("参数大于 5")
+ }else if(arg > 3){
+   print("参数大于 3")
+ }else{
+   print("参数小于等于 3")
+ }
[1] "参数小于等于 3"
> 

上例展示了几种if语句的用法,以if(condition1){ expression1 } else if(condition2){ expression2 } else{ expression3 }为例,从上到下依次判断,首先判断condition1,如果成立,则执行expression1,否则判断condition2,如果成立则执行expression2,否则执行expression3;这里需要注意,当不用{}将代码段括起来时,R语句需要与if等语句写在同一行,这样R才能识别


> x <- 1:5

> ifelse(x >= 3,print("大于等于3"),print("小于3"))
[1] "大于等于3"
[1] "小于3"
[1] "小于3"     "小于3"     "大于等于3" "大于等于3" "大于等于3"
>

ifelse(test,yes,no)函数是一个向量化的if-else结构的语句,test可以是一个boolean向量,结果也是一个长度相等的向量,其中每个元素是boolean向量中对应索引的值,如果为TRUE则取yes,如果为FALSE则取no;ifelse()函数由于是向量化运算,所以可以提高执行效率

循环语句

> (x <- c(1:8))
[1] 1 2 3 4 5 6 7 8

> for(i in x) print(i^2)    #for循环的循环体比较简单,只有一行语句
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36
[1] 49
[1] 64

> for(i in x){
+   print(i + 1)
+   print("=======")
+ } #for循环的循环体有多行时
[1] 2
[1] "======="
[1] 3
[1] "======="
[1] 4
[1] "======="
[1] 5
[1] "======="
[1] 6
[1] "======="
[1] 7
[1] "======="
[1] 8
[1] "======="
[1] 9
[1] "======="
>

上述示例分别展示了for(i in x)循环的循环体为一条语句时和多行时的用法;熟悉其他编程语言的读者应该对for循环比较熟悉,在R中,for循环表示对向量x中的每个元素依次赋值给变量i,然后执行循环体;当循环体只有一行时,for循环的循环体可以省略{},但是当循环体为多行时,必须加{},我们一般都使用{}以方便程序的阅读


> i <- 1
> while(i <= 10) i <- i+4   #使用while循环
> i
[1] 13
> 

> i <- 1
> while(TRUE) { #使用while循环,并用break跳出循环
+ i <- i+4
+ if(i > 10) break
+ }
> i
[1] 13
> 

> i <- -1
> repeat{   #使用repeat循环,并用break跳出循环
+ i <- i+4
+ if(i > 10) break
+ }
> i
[1] 11
> 

如其他编程语言一样,R中也可以使用while()循环和break语句

第一个例子中,先给变量i赋值为1,然后进入执行while循环,先判断循环条件i <= 10,条件成立则进入循环体i <- i+4,计算得i应该为5,然后再计算循环条件,依次计算;当i加到13时循环条件不成立,则跳出while循环,此时查看i的值即为13

在第二个例子中while循环条件为永真,则需要在循环体中判断当条件成立时用break语句跳出循环,否则会出现死循环,导致内存耗尽

第三个例子好像是while循环条件为永真的简写形式,它没有逻辑判断退出条件,必须利用break(或者类似return()函数)的语句跳出循环

当然break语句也可以用在for循环中


如其他编程语言中的continue;语句一样,R中也有个类似的语句next

> (x <- 1:8)
[1] 1 2 3 4 5 6 7 8

> for(i in x){
+   print(i + 1)
+   if(i > 4) next()
+   print("=======")
+ }
[1] 2
[1] "======="
[1] 3
[1] "======="
[1] 4
[1] "======="
[1] 5
[1] "======="
[1] 6
[1] 7
[1] 8
[1] 9
> 

next()语句表示跳过循环体中该语句后面的代码部分

这里for循环是从i为1一直循环到i为8,当i > 4的时候,就不执行循环体后面的部分代码


R并不支持直接对非向量集合的循环,但是有一些间接但简单的方式可以做到这点

使用lapply(),如果循环的每次迭代之间相互独立,就可以使用lapply(),可以允许以任意顺序执行

使用get(),这个函数接受一个代表对象名字的字符串参数,然后返回该对象的内容,这个函数非常强大

> (u <- matrix(1:6,nrow = 3))   #构造两个矩阵
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> (v <- matrix(11:16,nrow = 3))
     [,1] [,2]
[1,]   11   14
[2,]   12   15
[3,]   13   16

> for(m in c("u","v")){
+ z <- get(m)
+ print(z[,1]+z[,2])
+ }
[1] 5 7 9
[1] 25 27 29
> 

思路是将矩阵对象的名称字符封装进向量,然后对向量循环,然后利用get()函数到对象空间中取出对应名字的对象,然后就可以对对象进行操作了

可以使用ls()函数查看当前对象空间中有哪些对象
> ls()
[1] "arg" "i" "m" "u" "v" "x" "z"

其中对象的管理我们会在面向对象一篇中进行详细讲解

算术和逻辑运算符

运算符 描述
x + y 加法
x - y 减法
x * y 乘法
x / y 除法
x ^ y 乘幂
x %% y 模运算
x %/% y 整数除法
x == y 判断是否相等
x <= y 判断是否小于等于
x >= y 判断是否大于等于
x && y 标量的逻辑”与“运算
x
x & y 向量的逻辑”与“运算(x,y以及运算结果都是向量)
x | y 向量的逻辑”或“运算(x,y以及运算结果都是向量)
!x 逻辑非

R语言表面上没有标量的类型,因为标量可以看作是含有一个元素的向量,但我们看到表中:逻辑运算符对标量和向量有着不同的形式;问题的关键在于,if结构条件判断语句的取值,只能是一个逻辑值,而不是逻辑值的向量

> (x <- c(TRUE,FALSE,TRUE))
[1]  TRUE FALSE  TRUE

> (y <- c(TRUE,TRUE,FALSE))
[1]  TRUE  TRUE FALSE

> x & y
[1]  TRUE FALSE FALSE

> x[1] && y[1]
[1] TRUE

> x && y
[1] TRUE

> if(x[1] && y[1]) print("both TRUE")
[1] "both TRUE"

> if(x & y) print("both TRUE")
[1] "both TRUE"
Warning message:
In if (x & y) print("both TRUE") : 条件的长度大于一,因此只能用其第一元素
> 

逻辑值TRUE和FALSE可以缩写为T和F(两者都必须是大写),而在算术表达式中他们会转换为1和0

> 1 < 2
[1] TRUE

> (1 < 2) * (3 < 4)
[1] 1

> (1 < 2) == TRUE
[1] TRUE

> (1 < 2) == 1
[1] TRUE
> 
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注