抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

本文简述了 R 编程的基础操作。

简介

R 语言和 C++ 等编译型语言不同,属于解释型语言。与 MATLAB 一样,该语言可以使用命令行逐步运行命令。R的常用用户界面为 RStudio ,其命令提示符为 > 。在该行(也称命令行)输入命令后再输入Enter键便可运行。但在命令不能完整执行时按Enter键则不会运行命令,而是出现由延续提示符 + 的行,用以提供前面行的接续行。直至所有行的输入内容能够连成完整的命令后才会被执行。

R语言的注释符为 # ,以该符号开头的行会被注释掉而不运行。

在R运行期间,可以使用Ctrl+C终止运行。

可以使用Ctrl+L清除屏幕上的历史记录。

初等代数操作

初等代数操作一般是指代数运算。代数运算的特点是只进行有限次的加、减、乘、除和开方,其在 R 中对应的操作为 +-*/^

线性代数操作

线性代数操作一般是指向量、矩阵的代数运算。线性代数运算在 R 中主要分为两类:元素运算和矩阵运算。

可以使用 : 运算符来生成一组整数,如 a:b 会生成从 a 到 b 的全部整数。该运算符的返回值为一个向量:

1
2
> 1:5
[1] 1 2 3 4 5

结果行前的 [1] 表示结果的第一个值,例如:

1
2
3
4
> 4:100
[1] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
[40] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
[79] 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

这表示该结果的第 1 个值为 4 ,第 40 个值为 43 ,第 79 个值为 82 。[] 出现在行首位置,换行位置由程序决定。

对象

在 R 中,保存数据的方法就是将数据存储到 R 对象中。其作用与 C++ 或 MATLAB 等语言中的变量的作用类似。创建 R 对象的方式是使用赋值运算符 <-

1
2
3
4
5
> a <- 1
> a
[1] 1
> a + 2
[1] 3

R 对象的命名方式必须遵守以下规则:

  1. 不能以数字开头;
  2. 不能使用特殊符号 ^!$@+-/*

由于 R 大小写敏感,所以大小写不同的 R 对象名称会被认为是不同的 R 对象。

对同一个 R 对象的重复赋值过程,后面的赋值会覆盖掉之前的赋值。

可以使用 ls() 命令查看已命名的 R 对象:

1
2
> ls()
[1] "a"

R 运算的默认方式为元素运算,而不是矩阵运算。例如:

1
2
3
> a <- 1:4
> a * a
[1] 1 4 9 16

长度不同的向量在进行运算时,分为以下两种状况:

  1. 长向量的元素数量是短向量的元素数量的整数倍时,短向量会按原有顺序重复扩充,以长向量的元素数量与其进行运算:

    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
  2. 长向量的元素数量不是短向量的元素数量的整数倍时,也会按上述方式进行运算,但会弹出警告信息:

    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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> a <- 1:4
> b <- 1:2
> c <- 1:3
> a
[1] 1 2 3 4
> b
[1] 1 2
> c
[1] 1 2 3
> a+b
[1] 2 4 4 6
> a+c
[1] 2 4 6 5
Warning message:
In a + c : longer object length is not a multiple of shorter object length
> a
[1] 1 2 3 4
> b
[1] 1 2
> c
[1] 1 2 3

以上的行为在 R 中被称为向量循环。该运算模式的优点在于能够最大程度上保证数据集的同型运算(来源或用途不同的数据集的元素数量大概率互不相同)。

除了元素乘法 * ,R 也可以使用矩阵乘法。%*%%o% 分别为行内乘法行外乘法,具体效果为:

1
2
3
4
5
6
7
8
9
10
11
12
> a <- 1:4
> a
[1] 1 2 3 4
> a %*% a
[,1]
[1,] 30
> a %o% a
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 4 6 8
[3,] 3 6 9 12
[4,] 4 8 12 16

可以使用 t 命令执行矩阵转置

1
2
3
4
5
6
7
8
9
10
11
12
> a <- 1:4
> a
[1] 1 2 3 4
> t(a)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
> t(t(a))
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4

可以看出,R 中向量的默认储存方式为列向量

可以使用 det 命令计算行列式

1
2
3
4
5
6
> a
[,1] [,2]
[1,] 4 5
[2,] 7 9
> det(a)
[1] 1

函数

R 内置了大量的内置函数来处理数据。比如舍入函数 round() 、阶乘函数 factorial() 等:

1
2
3
4
5
6
7
8
> round(2.71828)
[1] 3
> round(3.14159)
[1] 3
> round(9.81)
[1] 10
> factorial(5)
[1] 120

() 内为传递到函数中的数据,称为该函数的参数。参数可以是原始数据、R 对象或另一个 R 函数的返回结果。在使用函数嵌套时,其执行顺序为从内到外。

数理统计基础

一般地,设一个总体含有 N 个个体,如果通过逐个抽取的方法从中抽取一个样本,且每次抽取时各个个体被抽到的概率相等,则这样的抽样方法叫做简单随机抽样。简单随机抽样最基本的抽样方法分为重复抽样不重复抽样两种。在重复抽样中,每次抽中的单位仍放回总体,样本中的单位可能不止一次被抽中。不重复抽样中,抽中的单位不再放回总体,样本中的单位只能抽中一次。

抽样函数

在 R 中实现抽样的最常见函数为 sample 。该函数的作用是从向量 x 中随机抽取 size 个元素,格式为 sample(x, size)

1
2
3
4
5
6
7
8
> x <- 1:10
> size <- 3
> sample(x, size)
[1] 9 1 4
> sample(x, size)
[1] 7 3 8
> sample(x, size)
[1] 5 4 9

函数中的参数可以使用以下几种方式赋值:

  • 所需参数值类型的值(参数值):sample(1:10, 3)
  • 等号赋值:sample(x = 1:10, size = 3)
  • 赋值变量:sample(x, size),其中 x 和 size 已赋值

但使用等号赋值的方式运行函数时,函数对应的参数名称不能更改(赋值变量的方式不受此限制),例如:

1
2
3
4
5
6
> sample(x = 1:5, size = 2)
[1] 5 2
> sample(y = 1:5, size = 2)
Error in sample(y = 1:5, size = 2) : unused argument (y = 1:5)
> sample(x = 1:5, num = 2)
Error in sample(x = 1:5, num = 2) : unused argument (num = 2)

等号赋值并不会影响函数外的同名变量:

1
2
3
4
5
6
7
8
> x <- 1:10
> size <- 3
> sample(x = 1:5, size = 2)
[1] 3 1
> x
[1] 1 2 3 4 5 6 7 8 9 10
> size
[1] 3

sample 函数默认为不重复抽样,可以通过指定 replace = TRUE 实现可放回抽样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> x <- 1:4
> size <- 3
> sample(x, size)
[1] 3 2 1
> sample(x, size)
[1] 3 2 4
> sample(x, size)
[1] 1 2 3
> sample(x, size, replace = TRUE)
[1] 1 4 1
> sample(x, size, replace = TRUE)
[1] 3 3 4
> sample(x, size, replace = TRUE)
[1] 1 1 1

查看参数函数

该函数的作用是查看函数的参数列表,格式为 args(name)

1
2
3
4
5
6
7
8
9
> args(factorial)
function (x)
NULL
> args(sample)
function (x, size, replace = FALSE, prob = NULL)
NULL
> args(round)
function (x, digits = 0)
NULL

具有等号 = 的参数表示该参数为可选参数,在未指定时会使用等号后的值作为参数。

使用参数值或赋值变量方式调用函数时,函数会按照定义的参数顺序赋值运行。而使用等号赋值的方式调用函数,则不需要考虑顺序。

出于可读性、兼容性等角度考量,推荐使用等号赋值方式调用函数,并尽可能保持其参数名定义顺序

自定义函数

R 函数包含三个部分:函数名、程序主体以及参数集合。定义函数需要用到 function 函数,其基本格式为:

1
my_function <- function() {}

具体实例:

1
2
3
4
5
> sampling <- function() {
population <- 1:10
samples <- sample(population, size = 3, replace = TRUE)
sum(samples)
}

R 对大小写敏感,但对缩进和空格数量不敏感

由于 RStudio 有自动补全机制,因此在命令行中编写程序时,按键{会补充为 {} 。因此为保证编写时不误保存,可以使用Shift+Enter进行换行,或删除后面的 } 以保证命令的不完整来触发接续换行,进而正常使用回车

无参数的函数在只打出函数名时按Enter会显示函数内容而不是调用函数。对于这类函数,后面的 () 在调用过程中不能省略。同样地,带参数的函数也是如此。

默认情况下,函数定义内定义的对象不会实例化(即函数调用完后不能再使用),因此同名对象不会受到影响,也不会生成新的对象。

R 不像 C++ 等语言一样使用类似于 return 关键字那样的机制来返回函数的值,而是使用最后一行代码的值作为函数的值,因此最后一行以外的常值函数或常值语句通常来讲是无意义的

参数

为了能够创建自定义含参函数,可以将对应的参数名写在 function 函数的 () 中,例如上面的 sampling 函数可以写成:

1
2
3
4
> sampling <- function(population) {
samples <- sample(population, size = 3, replace = TRUE)
sum(samples)
}

为了能够使用默认参数,可以在函数定义中对相应的参数进行等号赋值:

1
2
3
4
> sampling <- function(population = 1:10) {
samples <- sample(population, size = 3, replace = TRUE)
sum(samples)
}

脚本

与 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 包为最新版本)

  1. 在 R 中运行 dput(rdataset)rdataset 为需要用到的数据集
  2. 复制输出结果
  3. 在可重现脚本中输入 rdataset <- ,然后粘贴输出结果

尽可能地缩小数据集范围,只保留与问题相关的部分

  • 代码尽可能简洁
  • 填写必要的注释
  • 去除冗余的内容

最好在准备完可重现脚本后启动一个新的 R 会话,并运行此脚本,以查看可重现实例是否按预期工作

评论



This is a picture without description

This is a picture without description This is a picture without description This is a picture without description