R 基础

R (GNU-R) 是一个按 GNU 进行授权的著名的统计计算工具软件。 与 Matlab 在工程领域的广泛应用不同的是 R 在数据分析和统计领域拥有大量粉丝。

我个人更喜欢直接使用 R 做一个向量计算器。

获得 R

在 ubuntu 上获得 R 只需要一行命令:

$ sudo apt install r-base-core r-recommended

在 windows 上获得 R,请保持耐心地去这个网站里找相关的安装包吧: CRAN-镜像

使用 R

一般有两种使用 R 的场合,一种是进入交互式的命令环境,通过命令交互来使用 R。 另一种则是运行预先写好的 R 命令集合文本,也就是 R 脚本来使用 R。

进入R的交互式命令环境,可以使用:

$ R

这样会有一些使用提示,并会在当前工作目录下保存交互过程中产生的数据。 而我一般在使用 R 做计算器时,会带上两个参数 -q--vanilla 来关闭这些特性:

$ R -q --vanilla

退出 R 的交互式命令环境,使用 q() 函数:

$ q()

如果已经写好了一个脚本,例如叫作 my.r ,则可以使用 Rscript 来运行:

$ Rscript my.r

既然可以使用 Rscript 来运行脚本,当然可以直接这样使用,例如生成一个乘法表:

$ echo "1:10 %o% 1:10" | Rscript -

安装模块

一般地,在安装好了 r-base 之后或者 r-recommended 之后,就已经拥有了大量经典的 R 模块。 如果还需要一些特殊的 R 模块,可以使用如下列出的几种方法来安装。

  1. 在 ubuntu console 中可以使用 apt-get 或 apt 来安装 r-cran-XXX 等一系列的模块。
  2. 在 R 交互式命令环境中使用 install.packages() 函数来安装模块。
  3. 下载得到模块包后,可以在 console 中使用 R CMD INSTALL 来安装。

ubuntu 的 apt 安装

如果使用的是 ubuntu 或 debian linux,那么可以使用 debian 源上的 R 模块包,直接使用 apt / apt-get 来安装。 一般在安装之前需要使用 apt-cache search 来列出可能的模块:

$ apt-cache search r-cran | less

如果知道需要安装的模块名,比如说要安装 lattice,可以快速找到对应的包名:

$ apt-cache search r-cran | grep lattice

列出清单如下:

r-cran-lattice - GNU R package for 'Trellis' graphics
r-cran-latticeextra - GNU R package of additional graphical displays based on lattice

这时就可以用 apt 来安装了:

$ sudo apt install r-cran-lattice

R 命令环境中安装

在 R 交互式命令环境中,可以使用 available.packages() 函数来得到一个可以安装的模块清单, 一般地,这个清单将会超级长,例如我选择了合肥的镜像之后,得到的清单有 4718 条(这个清单还会变的)。

> available.packages()

可以直接使用 install.packages() 函数来安装。如下命令将会弹出一个有着长长清单的对话窗口, 可以从中选择一项来进行安装。

在有些情况下这种安装方式可能会失败,这时可能需要一些与失败原因相关的专业技能来解决。

下载模块后安装

在 R 的世界里,CRAN 是提供各种 R 模块的门径, 全称为综合性R档案网络 (Comprehensive R Archive Network),如果需要获得特殊的模块,可以去这里找,并下载到本地。 然后使用 R CMD INSTALL 来安装。

$ R CMD INSTALL mypackage -l /my/own/R-packages

寻求帮助

当然可以通过网络搜索、论坛提问等方式来寻求帮助。 但一般情况下,我们还有更快捷的获得帮助的办法,不过好像只能啃英文。 进入 R 交互式命令环境中,使用 help() 函数来获得帮助。

help(help)
help("help")
help('help')
?help
?"help"
?'help'

以上的6条命令效果都是一样的,会显示有关 help 的说明文档。 在帮助窗口中,遵循 man 操作习惯,使用空格键翻页,使用 q 键退出帮助窗口,使用 h 键获得更多操作键信息。

大多数情况下,可以省去单引号或者双引号,但也有一些情况是需要的,比如获得下标索引的帮助:

?'['

如果不知道确切的帮助主题词,可以试试 help.search() 函数:

help.search('??')
??'??'

上述的两个命令效果是一样的。

通用计算器

赋值运算

在 R 中当然可以使用 = 对一个变量完成赋值,但还有两个独特的赋值操作符:

  • <- 向左赋值
  • -> 向右赋值

在 R 中最好使用带有明确方向的赋值操作符,因为在有些特殊场合 = 并不一定管用, = 可能只是把值赋给了一个缓存的复制实例,而 <--> 则总是赋给了真实的实例。

常用运算

可以使用 R 完成通用计算任务,实现双精度数的各种运算:

12 + 3 / 2
(12 + 3) / 2

常用的运算有 +(正或加)、-(负或减)、\*(乘)、/(除)、^(指数)、 %%(取模)、%/%(整数除)。 运算参数按从左到右来结合,乘和除的结合优先于加和减。可以使用圆括号来优先结合运算表达式。

逻辑运算

逻辑运算有 &&/&(逻辑与), ||/|(逻辑或), !(逻辑非),需要注意的是在 R 中 逻辑与的结合优先于逻辑或,以下两个式子是等效的:

TRUE || TRUE && FALSE
TRUE || (TRUE && FALSE)

比较运算有 >(大于), <(小于), ==(等于), >=(大于等于), <=(小于等于), !=(不等于)。

常用数学及工程函数

常用的数学函数有:正弦:sin(), 余弦:cos(), 正切:tan(), 反正弦:asin(), 反余弦:acos(), 反正切:atan(), 双参反正切:atan2(), 绝对值:abs(), 开平方:sqrt(), 自然对数:log(), 2对数:log2(), 10对数:log10(), 自然幂:exp(), gama(), 对数型的lgama(), beta(), 对数型的lbeta(), 二项式系数:choose(), 对数型二项式系数:lchoose(), 阶乘:factorial(), 对数型的阶乘:lfactorial(), besselI(), besselJ(), besselK(), besselY()等。

复数运算

可以使用 i 来表示复数的虚数部分。一般地,如果一个数没有虚部则只能当成实数,按实数限制运算。 如果要把实数按虚数来结合运算,应该把 0i 作为虚部加上。如 sqrt() 开方:

> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
> sqrt(-1 + 0i)
[1] 0+1i
>

以上试图对负实数-1进行开方运算时,报错。如果希望得到复数的结果,应该一开始就提供复数-1+0i

多精度浮点运算

可以使用指定精度来输出一个浮点数,但是默认情况下在 R 中使用的都是双精度的浮点数。 使用 print() 来指定输出精度:

> exp(1)
[1] 2.718282
> print(exp(1), digits=10)
[1] 2.718281828
> print(exp(1), digits=100)
Error in print.default(exp(1), digits = 100) : invalid 'digits' argument
>

如果双精度数的计算不能满足要求,可以使用扩展模块来进行多精度浮点数的运算, 不过需要了解的是,多精度浮点数的运算远比双精度浮点数的运算慢。 寻求使用 Rmpfr 模块或者使用 Brobdingnag 模块。 上述两个模块在 ubuntu 中安装方法:

先在系统中安装 librmpfr 的开发包:

$ sudo apt-get install librmpfr-dev

然后在 R 交互式命令环境中安装 RmpfrBrobdingnag

install.packages('Rmpfr')
install.packages('Brobdingnag')

使用 Rmpfr 可以打印出自然对数的底的100个有效数字,命令如下:

> library('Rmpfr')
> print(exp(mpfr(1,precBits=256)), digits=100)
1 'mpfr' number of precision  256   bits
[1] 2.718281828459045235360287471352662497757247093699959574966967627724076630353554533648253673191314797
>

另外的使用多精度浮点数运算的例子:

library('Rmpfr')
n1.25 <- mpfr(5, precBits = 256)/4
n1.25
# 1 'mpfr' number of precision  256   bits
# [1] 1.25
n1.25 ^ 30
# 1 'mpfr' number of precision  256   bits
# [1] 807.793566946316088741610050849573099185363389551639556884765625
print(1.25 ^ 30, digits=19)
# [1] 807.7935669463161048

向量计算器

构造向量

在 R 中进行向量相关的计算特别的方便,(vector)向量是 R 的一种非常重要的对象类型。 首先,构造一个向量最基本的方法是使用 c() 函数。例如以列举的方式来构造一个向量:

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)

以上把一个向量(从1到9)赋给了变量 x。

可以在 c() 函数中使用向量参数作为新生成向量的一部分。如

y <- c(0, x, 10)

以上得到了一个新的向量 y ,元素是从0到10。

R中另有一些方便的方法来生成一些有一定规律的向量。如和以上的例子等效的命令为:

x <- 1:9
y <- 0:10

可以使用 seq() 函数来按开始、结束、步长、个数等来生成序列:

z <- seq(1, 9, by=2)

如上的 z 是按步长2从1到9生成的序列,内容为 1, 3, 5, 7, 9。

可以使用 rep() 函数来重复己知向量中的元素以生成新的向量。

a <- rep(x, 3)
b <- rep(x, each=3)

a 中的内容为 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9。 b 中的内容为 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9。

向量运算

在 R 中,向量是可以被当成同等看待的,能用进行运算的地方一般也都能用 向量来进行运算的。 不妨反过来理解可能更直观一些,即实际上是长度为1的向量

一般地,两个向量进行运算时,按顺序对相同位置的数进行运算,得到的结果再拼成一个新的向量。 当参与运算的两个向量长度不等时,会把较短的向量进行循环复制,一直补齐到和较长者一样长为止, 然后再进行运算。

向量的特性

向量的长度可以使用函数 length() 来得到。

向量的元素可以使用下标来索引,并且可以使用另一个向量作为下标来选择一组元素并生成新的向量。

> x <- 1:9
> x[1]
[1] 1
> x[1:3]
[1] 1 2 3
>

也可以使用一组逻辑向量来做下标,对向量的元素进行选择:

> x %% 3 == 1
[1]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE
> x[ x%% 3 == 1]
[1] 1 4 7
>

可以给向量的每个元素命名:

> paste(letters)[1:9]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i"
> x
[1] 1 2 3 4 5 6 7 8 9
> paste(letters)[1:9] -> names(x)
> x
a b c d e f g h i
1 2 3 4 5 6 7 8 9
>

向量中的元素一旦有了名字,就可以使用名字来引用:

> x[5]
e
5
> x['e']
e
5
>