@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
>