本文简述了 R 编程的基础操作。
简介
R 语言和 C++ 等编译型语言不同,属于解释型语言。与 MATLAB 一样,该语言可以使用命令行逐步运行命令。R的常用用户界面为 RStudio ,其命令提示符为 >
。在该行(也称命令行)输入命令后再输入Enter键便可运行。但在命令不能完整执行时按Enter键则不会运行命令,而是出现由延续提示符 +
的行,用以提供前面行的接续行。直至所有行的输入内容能够连成完整的命令后才会被执行。
R语言的注释符为 #
,以该符号开头的行会被注释掉而不运行。
在R运行期间,可以使用Ctrl+C终止运行。
可以使用Ctrl+L清除屏幕上的历史记录。
初等代数操作
初等代数操作一般是指代数运算。代数运算的特点是只进行有限次的加、减、乘、除和开方,其在 R 中对应的操作为 +
、-
、*
、/
、^
。
线性代数操作
线性代数操作一般是指向量、矩阵的代数运算。线性代数运算在 R 中主要分为两类:元素运算和矩阵运算。
可以使用 :
运算符来生成一组整数,如 a:b
会生成从 a 到 b 的全部整数。该运算符的返回值为一个向量:
1 | > 1:5 |
结果行前的 [1]
表示结果的第一个值,例如:
1 | > 4:100 |
这表示该结果的第 1 个值为 4 ,第 40 个值为 43 ,第 79 个值为 82 。[]
出现在行首位置,换行位置由程序决定。
对象
在 R 中,保存数据的方法就是将数据存储到 R 对象中。其作用与 C++ 或 MATLAB 等语言中的变量的作用类似。创建 R 对象的方式是使用赋值运算符 <-
:
1 | > a <- 1 |
R 对象的命名方式必须遵守以下规则:
- 不能以数字开头;
- 不能使用特殊符号
^
、!
、$
、@
、+
、-
、/
和*
。
由于 R 大小写敏感,所以大小写不同的 R 对象名称会被认为是不同的 R 对象。
对同一个 R 对象的重复赋值过程,后面的赋值会覆盖掉之前的赋值。
可以使用 ls()
命令查看已命名的 R 对象:
1 | > ls() |
R 运算的默认方式为元素运算,而不是矩阵运算。例如:
1 | > a <- 1:4 |
长度不同的向量在进行运算时,分为以下两种状况:
长向量的元素数量是短向量的元素数量的整数倍时,短向量会按原有顺序重复扩充,以长向量的元素数量与其进行运算:
1
2
3
4> 1:6 + 1:2
[1] 2 4 4 6 6 8
> 1:6 - 1:3
[1] 0 0 0 3 3 3长向量的元素数量不是短向量的元素数量的整数倍时,也会按上述方式进行运算,但会弹出警告信息:
1
2
3
4
5> 1:6 - 1:4
[1] 0 0 0 0 4 4
Warning message:
In 1:6 - 1:4 :
longer object length is not a multiple of shorter object length
以上两种状况均不会改变短向量的值:
1 | > a <- 1:4 |
以上的行为在 R 中被称为向量循环。该运算模式的优点在于能够最大程度上保证数据集的同型运算(来源或用途不同的数据集的元素数量大概率互不相同)。
除了元素乘法 *
,R 也可以使用矩阵乘法。%*%
和 %o%
分别为行内乘法和行外乘法,具体效果为:
1 | > a <- 1:4 |
可以使用 t
命令执行矩阵转置:
1 | > a <- 1:4 |
可以看出,R 中向量的默认储存方式为列向量
可以使用 det
命令计算行列式:
1 | > a |
函数
R 内置了大量的内置函数来处理数据。比如舍入函数 round()
、阶乘函数 factorial()
等:
1 | > round(2.71828) |
()
内为传递到函数中的数据,称为该函数的参数。参数可以是原始数据、R 对象或另一个 R 函数的返回结果。在使用函数嵌套时,其执行顺序为从内到外。
数理统计基础
一般地,设一个总体含有 N 个个体,如果通过逐个抽取的方法从中抽取一个样本,且每次抽取时各个个体被抽到的概率相等,则这样的抽样方法叫做简单随机抽样。简单随机抽样最基本的抽样方法分为重复抽样和不重复抽样两种。在重复抽样中,每次抽中的单位仍放回总体,样本中的单位可能不止一次被抽中。不重复抽样中,抽中的单位不再放回总体,样本中的单位只能抽中一次。
抽样函数
在 R 中实现抽样的最常见函数为 sample
。该函数的作用是从向量 x
中随机抽取 size
个元素,格式为 sample(x, size)
:
1 | > x <- 1:10 |
函数中的参数可以使用以下几种方式赋值:
- 所需参数值类型的值(参数值):sample(1:10, 3)
- 等号赋值:sample(x = 1:10, size = 3)
- 赋值变量:sample(x, size),其中 x 和 size 已赋值
但使用
1 | > sample(x = 1:5, size = 2) |
等号赋值并不会影响函数外的同名变量:
1 | > x <- 1:10 |
sample
函数默认为不重复抽样,可以通过指定 replace = TRUE
实现可放回抽样:
1 | > x <- 1:4 |
查看参数函数
该函数的作用是查看函数的参数列表,格式为 args(name)
:
1 | > args(factorial) |
具有等号 =
的参数表示该参数为可选参数,在未指定时会使用等号后的值作为参数。
使用参数值或赋值变量方式调用函数时,函数会按照定义的参数顺序赋值运行。而使用等号赋值的方式调用函数,则不需要考虑顺序。
出于可读性、兼容性等角度考量,推荐使用等号赋值方式调用函数,并尽可能保持其参数名定义顺序
自定义函数
R 函数包含三个部分:函数名、程序主体以及参数集合。定义函数需要用到 function
函数,其基本格式为:
1 | my_function <- function() {} |
具体实例:
1 | > sampling <- function() { |
R 对大小写敏感,但对缩进和空格数量不敏感
由于 RStudio 有自动补全机制,因此在命令行中编写程序时,按键{会补充为 {} 。因此为保证编写时不误保存,可以使用Shift+Enter进行换行,或删除后面的 } 以保证命令的不完整来触发接续换行,进而正常使用回车
无参数的函数在只打出函数名时按Enter会显示函数内容而不是调用函数。对于这类函数,后面的 ()
在调用过程中不能省略。同样地,带参数的函数也是如此。
默认情况下,函数定义内定义的对象不会实例化(即函数调用完后不能再使用),因此同名对象不会受到影响,也不会生成新的对象。
R 不像 C++ 等语言一样使用类似于 return 关键字那样的机制来返回函数的值,而是使用最后一行代码的值作为函数的值,因此最后一行以外的常值函数或常值语句通常来讲是无意义的
参数
为了能够创建自定义含参函数,可以将对应的参数名写在 function
函数的 ()
中,例如上面的 sampling 函数可以写成:
1 | > sampling <- function(population) { |
为了能够使用默认参数,可以在函数定义中对相应的参数进行等号赋值:
1 | > sampling <- function(population = 1:10) { |
脚本
与 MATLAB 、Python 等解释型语言一样,R 也支持使用脚本进行代码编辑和运行。在 RStudio 中,脚本面板上的 Run 与其它大部分 IDE 运行不大相同。这里的 Run 只会运行光标所在行的内容,而要运行整个脚本,则需要点击旁边的 Source 。
帮助
帮助页面
RStudio 的帮助界面位于右下角面板的 Help 选项卡中。也可以使用 help
函数来显示帮助内容,格式为 help("<func>")
,例如查询 sample
函数:
1 | > help("sample") |
此时右下角面板会自动跳转至 Help 页面
帮助页一般会包含对应函数的描述、用法、参数、细节、返回值、参考文献、函数相关以及示例等。
Stack Overflow
除了使用搜索引擎和帮助页面之外,也可以使用 Stack Overflow
。在该社区寻求帮助时最好的方法是准备一个 reprex
(可重现实例),里面包含 3 项内容:所需 R 包、数据和代码。
R 包的加载步骤尽可能写于可重现脚本开头(最好确保 R 包为最新版本)
- 在 R 中运行
dput(rdataset)
,rdataset
为需要用到的数据集 - 复制输出结果
- 在可重现脚本中输入
rdataset <-
,然后粘贴输出结果
尽可能地缩小数据集范围,只保留与问题相关的部分
- 代码尽可能简洁
- 填写必要的注释
- 去除冗余的内容
最好在准备完可重现脚本后启动一个新的 R 会话,并运行此脚本,以查看可重现实例是否按预期工作