3.1 安装包
3.1.1 CRAN
CRAN是最大的R包库。除了成功构建和安装之外,上传包的要求很少,因此文档和支持通常很少,而弄清楚如何使用这些包本身可能是一个挑战。CRAN是R默认搜索的存储库,用于查找要安装的软件包。
3.1.2 Github
Github并不专属于R,任何类型、任何状态的代码都可以上传。上传到github的软件包甚至不能保证一定能安装,更别说能达到其声称的效果了。可以使用R中的devtools软件包直接从github下载并安装R包。
Github也是一个版本控制系统,它存储任何包的多个版本。默认情况下,安装软件包的最新“主”版本。如果您想要旧版本或开发分支,可以使用“ref”参数指定。
3.1.3 Bioconductor
Bioconductor是一个专门用于生物分析的R包库。它对提交有最严格的要求,包括在每个平台上的安装和完整的文档以及一个教程来解释如何使用该包。Bioconductor还鼓励使用标准数据结构/类和编码风格/命名约定,以便理论上可以将包和分析组合成大型流程或工作流。
Bioconductor还要求创建者支持他们的更新,并且每6个月定期发布一次。
3.1.4 源码
安装软件包的最后一种方式是直接从源代码安装。在这种情况下,您必须下载完整构建的源代码文件,通常是packagename.tar.gz,或者克隆github存储库并自行重建软件包。一般来说,仅当您想自己编辑包,或者由于某种原因之前的方法失败时,才会这样做。
3.2 安装说明
根据需求安装具有各种功能的R软件包。
3.3 数据类型
与大多数编程语言一样,R使用变量来存储数据。可以通过输入变量名称、赋值运算符(=
或<-
)和值来创建变量:
> var <- 10
> var
[1] 10
我们创建了名为var
的变量,存储数值10。
R中变量总共有20多种类型,但通常只有其中几种直接使用:逻辑型、整数型、数字型、字符型、列表型和S4型。前四个表示单一数据类型,它们是具有一种类型的值的简单数据结构。列表和S4变量允许存储更复杂的数据结构。可以使用typeof
函数访问变量的类型。让我们首先讨论单一数据类型。
3.3.1 逻辑型(Logical)变量
逻辑类型存储布尔值,即TRUE和FALSE。它用于存储逻辑运算的结果,条件语句将被强制转换为此类型。
> x = TRUE
> typeof(x)
[1] "logical"
> is.logical(x)
[1] TRUE
> x = 2 > 3
> x
[1] FALSE
R具有所有常见的逻辑运算符:
> x = TRUE
> !x
[1] FALSE
> !(2 > 3)
[1] TRUE
> TRUE | FALSE
[1] TRUE
> !x | (2 > 3)
[1] FALSE
> x & FALSE
[1] FALSE
> x & TRUE
[1] TRUE
3.3.2 数字型(Numeric)和整数型(Integer)变量
数字类型用于存储十进制数。
> x = 1.141
> typeof(x)
[1] "double"
> y = 42
> typeof(y)
[1] "double"
> z = 6.02e23
> typeof(z)
[1] "double"
这里我们看到,尽管R有一个整数型变量,并且42可以更有效地存储为整数,但使用上面使用的符号,它被存储为数字型变量。如果我们想将42存储为整数,则必须使用特定的符号来指定它:
> y = 42L
> typeof(y)
[1] "integer"
R内置了所有常见的数学运算符和函数:
> 2 + 3
[1] 5
> 3 * 4
[1] 12
> 4 / 2
[1] 2
> 5^2
[1] 25
> c = 2*(3+7)/5 + 1
> sin(c)
[1] -0.9589243
> sqrt(c)
[1] 2.236068
3.3.3 字符型(Character)变量
字符类型存储文本。可以使用单引号或双引号创建文本变量,它们完全可以互换:
> a = "some text"
> a
[1] "some text"
> typeof(a)
[1] "character"
> b = 'another text. "Double quotes" can be used here'
> b
[1] "another text. \"Double quotes\" can be used here"
除了标准的字母数字字符外,字符串还可以存储各种特殊字符。特殊字符使用反斜杠后跟单个字符来指定,最相关的是制表符的特殊字符:\t
和换行符:\n
:
> cat("'Hello World\n'")
'Hello World
'>cat("'Hello\tWorld\n'"))
'Hello World
'>cat("'Hello\nWorld\n'"))
'Hello
World
'>
文本有许多有用的功能,让我们简单讨论一下其中的几个:
> paste("hello","world")
[1] "hello world"
> paste("hello","world",sep='_')
[1] "hello_world"
> paste0("he",'llo')
[1] "hello"
> text = 'hello world'
> gsub('hello','goodbye',text)
[1] "goodbye world"
> grepl('wo',text)
[1] TRUE
> grepl('bye',text)
[1] FALSE
3.3.4 这些都是向量(Vectors)
到目前为止,我们在每个变量中只存储一个值。但实际上,我们刚刚讨论的所有类型都是向量,也就是说,它们可以存储任意数量的给定类型的值。函数c
可用于创建新的向量:
> n = c(1,3,-2)
> n
[1] 1 3 -2
> typeof(n)
[1] "double"
> 4:7
[1] 4 5 6 7
> 10:2
[1] 10 9 8 7 6 5 4 3 2
> t = c('hello','world')
> t
[1] "hello" "world"
> typeof(t)
[1] "character"
> length(t)
[1] 2
> t[3]
[1] NA
> t[3] = 'and'
> t[4] = 'goodbye'
> t
[1] "hello" "world" "and" "goodbye"
向量只能存储相同类型的值。如果尝试组合不同类型的值,它们会按照以下顺序自动强制转换为最右边的类型:逻辑->整数->数字->字符:
> (x = c(TRUE,FALSE))
[1] TRUE FALSE
> typeof(x)
[1] "logical"
> (x = c(TRUE,FALSE,2L,10.2))
[1] 1.0 0.0 2.0 10.2
> typeof(x)
[1] "double"
> (x = c(TRUE,FALSE,2L,10.2,'text'))
[1] "TRUE" "FALSE" "2" "10.2" "text"
> typeof(x)
[1] "character"
> TRUE + 1
[1] 2
> FALSE + TRUE
[1] 1
> typeof(3L + 1.3)
[1] "double"
> (x=1:10 > 5)
[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
> sum(x)
[1] 5
> (ages = rnorm(10,mean=60,sd = 10))
[1] 52.70747 58.83174 44.64927 60.05729 74.86601 56.82183 42.05328 66.38318
[9] 72.95610 63.28234
> sum(ages>60)
[1] 5
3.3.5 向量操作
由于R中的所有基本类型都是向量,因此运算符和许多函数都是向量化的,也就是说,它们对向量参数的每个元素执行运算:
> a = 1:10
> a^2
[1] 1 4 9 16 25 36 49 64 81 100
> b = 5:-4
> a * b
[1] 5 8 9 8 5 0 -7 -16 -27 -40
如果操作数的长度不一样会发生什么?
> a * 2
[1] 2 4 6 8 10 12 14 16 18 20
> a * (1:2)
[1] 1 4 3 8 5 12 7 16 9 20
> a * (1:3)
[1] 1 4 9 4 10 18 7 16 27 10
Warning message:
In a * (1:3) :
longer object length is not a multiple of shorter object length
3.4 命名向量
R允许对向量元素进行命名:
> (a = c(a=1,b=3,other.name=10))
a b other.name
1 3 10
可以通过names
函数访问和修改名称:
> names(a)
[1] "a" "b" "other.name"
> names(a)[1] = 'newname'
> a
newname b other.name
1 3 10
> names(a) = LETTERS[1:3]
> a
A B C
1 3 10
往期内容:
重生之我在剑桥大学学习单细胞RNA-seq分析——2. scRNA-Seq原始测序数据处理(1)
重生之我在剑桥大学学习单细胞RNA-seq分析——2. scRNA-Seq原始测序数据处理(2)