生物信息学生R入门教程–R语法基础

基本运算

可以象使用计算器一样来使用R吗?答案是肯定的,而且非常简单。

> 1 + 1
## [1] 2
> .4 - .7 + .3 # 什么?居然不是0!
## [1] 5.551e-17
> x <- 10
> sqrt(x)
## [1] 3.162
> y = exp(x)
> y
## [1] 22026
> log(y) -> z; z
## [1] 10
> exp(log(x))
## [1] 10

在R的命令行可以直接进行加减乘除等四则混合运算。可以让运算的结果直接返回,也可以将它赋值给一个变量。变量不需要声明其类型,系统会自动判断。

可以使用”<-“, ”=“, 以及”->“三种形式的赋值符号。虽然R提供了这样的灵活性,但是从规范的角度来讲,”->“这一赋值符号应该尽量避免使用。而在赋值语句中,尽量只使用”<-“。”=“应该只出现在函数的参数赋值中。这在之后的R/Bioconductor的书写规范中会详细讲解。

同一行如果想写多个命令,需要使用”;“来分隔。但是,这在标准的R书写中是不被鼓励的。

.4 – .7 + .3为什么会不等于零呢?这就是计算机的浮点数问题。计算机在保存一个浮点数a时,是由两个数m和e来表示:a = m x be。m是有位数限制的,这就决定了等号右边不可能完全等于等号左边的a。所以浮点数在计算机中的保存只是它的一个近似数。在计算机编程中,应该十分注意浮点数问题。比如

> floor(29/50 * 50)
## [1] 28
> floor(29 * 50/50)
## [1] 29

我们来仔细了解一下其原因。

> op <- options(digits = 22)  ##设置显示精度为22位
> 29/50
## [1] 0.579999999999999960032
> 0.58 * 50
## [1] 28.99999999999999644729
> 29 * 50/50
## [1] 29
> options(op)  ##恢复之前的设置

可以看到,.58在计算机中只能以近似数0.579999999999999960032来代替,这就是为什么通过floor求整数放大后就会完全得到不同的答案。因此,如果先做了除法再进行其它运算,其结果可能和预想的有差别,所以在R的计算中,应该尽量避免先做除法运算。

显然R的威力不止于简单的四则混合运算,它对大量数据的复杂运算,行列式运算,以及统计运算都是非常适合的。在此列举一些简单的例子。

> ## 变量中保存一系列数字
> a <- c(1, 2, 3, 4)  ## c是combine缩写,可以简单地理解为将数据分组在一起
> a + 5
## [1] 6 7 8 9
> a - 10
## [1] -9 -8 -7 -6
> c <- (a + sqrt(a))/exp(a)
> c
## [1] 0.7358 0.4621 0.2356 0.1099
> a * c
## [1] 0.7358 0.9241 0.7068 0.4396
> b <- sort(a, decreasing = TRUE)
> b
## [1] 4 3 2 1
> max(a)
## [1] 4
> mean(a)
## [1] 2.5
> fivenum(a)
## [1] 1.0 1.5 2.5 3.5 4.0

在R中,逻辑运算符(logical operator)有!, &, &&, |, ||, xor, isTRUE等等。&与&&, |与||有什么区别呢?在R中将&和|称为短逻辑符,&&及||称为长逻辑符。长逻辑符只比较左边和右边的第一个元素,而短逻辑符会一一比较所有的元素。

> a <- c(TRUE, FALSE, TRUE, FALSE)
> b <- c(FALSE, FALSE, TRUE, TRUE)
> c <- c(TRUE, FALSE, FALSE, FALSE)
> a & b
## [1] FALSE FALSE  TRUE FALSE
> a && b
## [1] FALSE
> a | c
## [1]  TRUE FALSE  TRUE FALSE
> a || c
## [1] TRUE

因为R是不需要声明变量的,任何以字母或者.起始的字符组合(除了保留字)都可以成为变量名,所以在操作中容易错误的覆盖已经使用的变量。可以使用ls()函数来显示当前搜索路径下所有的变量名,然后再决定应该使用很什么样的新变量名。

> ls()
## [1] "a"  "b"  "c"  "fn" "op" "x"  "y"  "z"

在R中,保留字有:if else repeat while function for in next break

TRUE FALSE NULL Inf NaN NA NA_integer_ NA_real_ NA_complex_ NA_character_

… and ..1, ..2等。

在R中,条件控制语句与主流编程语言保持一至。基本的条件语句有:
if, ifelse, switch, for, while, next, break。

> hairLength <- 25
> waistHeight <- 110
> height <- 168
> marryMe <- FALSE
> if (hairLength >= height - waistHeight) {
+     marryMe <- TRUE
+ }
> ifelse(marryMe, "YES", "NO")
## [1] "NO"
> day <- 0
> if (!marryMe) {
+     while (hairLength < height - waistHeight) {
+         day <- day + 1
+         hairLength <- hairLength + 0.1
+     }
+     marryMe <- TRUE
+ }
> day
## [1] 330
> 
> hairLength <- 25
> marryMe <- FALSE
> wait <- 100 * 365
> for (day in 1:wait) {
+     if (hairLength >= height - waistHeight) {
+         marryMe <- TRUE
+         break
+     } else {
+         if (runif(1) < 0.5) {
+             next
+         }
+         hairLength <- hairLength + 0.1
+     }
+ }
> day
## [1] 693

2 thoughts on “生物信息学生R入门教程–R语法基础

  1. 您好,问个最简单的问题,我输入 biocLite(“ChIPpeakAnno”)后,为什么会下载其他很多包,而不是括号里的那个包呢?而且,我在括号里不输入任何名称会直接开始下载,没有选路径,不知道会下载到哪里?

    1. 那些包是ChIPpeakAnno的依存包。ChIPpeakAnno是在他们的基础上开发出来的。你可以使用.libPaths()来查看安装的目录。

发表评论

电子邮件地址不会被公开。 必填项已用*标注