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 模块,可以使用如下列出的几种方法来安装。
- 在 ubuntu console 中可以使用 apt-get 或 apt 来安装 r-cran-XXX 等一系列的模块。
- 在 R 交互式命令环境中使用 install.packages() 函数来安装模块。
- 下载得到模块包后,可以在 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 交互式命令环境中安装 Rmpfr
和 Brobdingnag
:
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
>