R语言

R语言是一种自由软件程式语言与操作环境，主要用于统计分析、绘图以及数据挖掘。R由新西兰奥克兰大学的统计学家罗斯·伊哈卡和罗伯特·杰特曼开发，现在由R核心小组负责开发，同时也有其他用户编写了诸多外挂的软件包。R以S语言为基础，其词法作用域语义来自Scheme。R的后台程序大多由C语言、FORTRAN语言和R自己写成。

R语言是GNU计划的一个项目，所以其源代码可自由下载使用。R也有已编译的执行档版本可以下载，可在多种平台下运行，包括UNIX（也包括FreeBSD和Linux）、Windows和MacOS。R可以以命令行操作，同时有人开发了几种图形用户界面，其中包括RStudio与Jupyter。

在TIOBE2022年1月对编程语言人气的排名中，R排名第12。

## 发展历程

R语言以S语言为基础，增加了Scheme语言中词法作用域这一机制，使程序员得以将代码中某一对象的适用范围限制到一小段代码之中。S由里克·贝克尔、约翰·钱伯斯、道格·邓恩、琼·麦克雷、以及朱迪·席林于1976年前后于贝尔实验室发明。S是一种用于数据分析的解释型语言，无需编译器即可运行。通常用S语言编写的代码都可以不作修改地在R环境下运行。Scheme是Lisp语言的一个分支，由杰拉尔德·J·萨斯曼和小盖伊·L·斯蒂尔于1975年前后在麻省理工学院发明。

1991年，新西兰奥克兰大学的统计学家罗斯·伊哈卡和罗伯特·杰特曼开始对S语言的一个新版本进行开发。伊哈卡与杰特曼两人名字首字母都是R，R语言因此得名。同时，R这个单一字母的名字也表明R语言与S语言一脉相承。1993年8月，伊哈卡与杰特曼在数据平台StatLib和邮件列表s-news中发布了R的早期版本。1995年，在统计学家马丁·梅克勒的建议下，伊哈卡与杰特曼通过GNU通用公共许可证把R做成了一款免费开源软件。软件于1995年6月进行了首次官方发布。首个稳定测试版本（1.0）于2000年2月29日发布。

R综合档案网（Comprehensive R Archive Network；CRAN）于1997年4月23日正式上线。CRAN除了收藏了R的执行档下载版、源代码和说明文件，也收录了各种用户撰写的R软件包。CRAN最早有3个镜像以及12个软件包。截止2022年1月，CRAN有101个镜像站以及18728个软件包。

同样在1997年，R核心小组正式成立，以进一步对R语言进行开发。截止2022年1月，小组成员包括伊哈卡、杰特曼、钱伯斯以及梅克勒，同时也包括了统计学家库尔特·奥尔尼克、道格拉斯·贝茨、彼得·达尔高、卢克·蒂尔尼、弗里德里希·莱施、托马斯·拉姆利、邓肯·坦普尔·朗、迈克尔·劳伦斯、乌韦·利格斯、布莱恩·里普利、塞巴斯蒂安·迈耶、保罗·默雷尔、马丁·普卢默、迪伊潘·萨卡尔、西蒙·乌尔巴内克以及计算机科学家托马斯·卡利贝拉。小组过去的成员包括塞思·福尔肯、圭多·马萨罗托、邓肯·默多克、马丁·摩根、海纳·施瓦特以及斯特凡诺·雅各斯。2003年4月，一个名为R基金会的非盈利组织正式成立，为的是更好地对R语言的开发提供支持。

## 内置功能

R主要用于数据分析。在R语言中，用于信息存储的数据结构包括向量、数组、列表以及数据框。向量指一组带有固定顺序, 数据类型唯一的字串或数值，其内容可以填写到一维或多维的数组之中。二维数组也叫做矩阵。R支持各种数组运算，与自由软件GNU Octave和商业软件MATLAB的功能有所重叠。列表指一组数据类型可能有所不同的对象。一个字串向量与数值向量合在一起就可以成为一个列表。数据框本质上是一个列表，里面包含了一个或多个长度相同的向量。数据框将这些向量合并成表格，每一纵列都有一个单一的名称。标量这一数据类型在R语言中并不存在，所谓的标量就是一个长度为一的向量。

用户可以用R来进行一些基本的统计检验，构建线性及非线性的模型，对时间序列加以分析，或对数据进行分类与聚类分析。R的另一强项是绘图功能，画出的图表能够达到专业出版物的要求，也可加入数学符号。计算强度较大时，用户可在程序中嵌入C、C++以及FORTRAN语言以帮助运算。

因为S的血缘，R比其他统计学或数学专用的编程语言有更强的物件导向（面向对象程序设计, S3, S4等）功能。

## 套件

R的功能能够透过由用户撰写的套件（Packages）增强。增加的功能有特殊的统计技术、绘图功能，以及编程界面和数据输出／输入功能。这些软件包是由R语言、LaTeX、Java及最常用C语言和Fortran撰写。下载的执行档版本会连同一批核心功能的软件包，而根据CRAN纪录有一万多种不同的软件包。其中有几款较为常用，例如用于经济计量、财经分析、人文科学与社会科学研究以及人工智能。

## 发展

生物信息学社群时常使用R进行分子生物学数据分析。Bioconductor计划就是让R作为基因图谱分析工具。Gnumeric开发者正和R开发者合作，改善Gnumeric计算结果的精确度。

## R新闻杂志

《R新闻杂志》（R Newsletter）每年会出版两至三次，为一份免费的电子杂志，内容有关统计学软件发展及R语言开发资讯。第一期在2001年一月出版。从2008年开始，被R Journal替代。

## 例子

### 基本语法

下面的例子展示基本的语言语法和命令行界面使用。在R语言中，一般偏好采用两字符合成箭头的赋值算符`<-`，但是在某些情况也可以使用`=`most used assignment operator in R is `<-` * * * *。

```rout
> x <- 1:6 # 在当前环境中创建数值向量。
> y <- x^2 # 基于在x中的值创建向量。
> print(y) # 打印向量的内容。
[1]  1  4  9 16 25 36

> z <- x + y # 创建是为x与y的和的新向量。
> z # 返回z的内容至当前环境。
[1]  2  6 12 20 30 42

> z_matrix <- matrix(z, nrow=3) # 创建将向量z转变为3x2矩阵对象的新矩阵。
> z_matrix 
     [,1] [,2]
[1,]    2   20
[2,]    6   30
[3,]   12   42

> 2*t(z_matrix)-2 # 转置这个矩阵，对每个元素乘以2，从矩阵中每个元素减去2，并返回结果至终端。
     [,1] [,2] [,3]
[1,]    2   10   22
[2,]   38   58   82

> new_df <- data.frame(t(z_matrix), row.names=c('A','B')) # 创建包含来自转置的z_matrix的数据的新data.frame对象，具有横行名字'A'和'B'。
> names(new_df) <- c('X','Y','Z') # 设置new_df的纵列名字为X、Y和Z。
> print(new_df)  # 打印当前结果。
   X  Y  Z
A  2  6 12
B 20 30 42

> new_df$Z # 输出Z列。
[1] 12 42

> new_df$Z==new_df['Z'] && new_df[3]==new_df$Z # data.frame的Z列可以使用$Z、['Z']或[3]语法来访问，得到的值是相同的。 
[1] TRUE

> attributes(new_df) # 打印关于new_df对象的特性信息。
$names
[1] "X" "Y" "Z"

$row.names
[1] "A" "B"

$class
[1] "data.frame"

> attributes(new_df)$row.names <- c('one','two') # 访问并接着变更row.names特性；还可以使用rownames()来完成。
> new_df
     X  Y  Z
one  2  6 12
two 20 30 42
```

### 函数的结构

R语言的力量之一是易于创建新函数。在函数体内的对象保持局部于这个函数，而且可以返回任何数据类型。例如：

```r
# 声明函数“f”具有参数“x”、“y“。
# 它返回x和y的线性组合。
f <- function(x, y) {
  z <- 3 * x + 4 * y
  return(z) ## 这里的return()函数是可选的。
}
```

```rout
> f(1, 2)
[1] 11

> f(c(1,2,3), c(5,3,4))
[1] 23 18 25

> f(1:3, 4)
[1] 19 22 25
```

### 建模和绘图

R语言对数据建模和图形有内建支持。下列例子展示R语言如何轻易的生成并绘制带有残差的线性回归模型。

<image>

```rout
> x <- 1:6 # 创建x和y值。
> y <- x^2  
> model <- lm(y ~ x)  # 线性回归模型y = A + B * x。
> summary(model)  # 显示这个模型的深入总结。

Call:
lm(formula = y ~ x)

Residuals:
      1       2       3       4       5       6       7       8      9      10
 3.3333 -0.6667 -2.6667 -2.6667 -0.6667  3.3333

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  -9.3333     2.8441  -3.282 0.030453 * 
x             7.0000     0.7303   9.585 0.000662 ***
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.055 on 4 degrees of freedom
Multiple R-squared:  0.9583, Adjusted R-squared:  0.9478
F-statistic: 91.88 on 1 and 4 DF,  p-value: 0.000662

> par(mfrow = c(2, 2))  # 创建2乘2格局的图表。
> plot(model)  # 输出这个模型的诊断图。
```

### 曼德博集合

通过对方程z = z2 + c的前20次迭代计算曼德博集合的简短R代码，它针对不同的复数常量c而绘图。这个例子展示了：

<image>

- 使用社区开发库（叫做R包），这里是caTools包。
- 处理复数。
- 多维数值数组作为基本数据类型，用于变量`C`、`Z`和`X`。

```r
install.packages("caTools")  # 安装外部包。
library(caTools)             # 这个外部包提供write.gif函数。
jet.colors <- colorRampPalette(c("green", "pink", "#007FFF", "cyan", "#7FFF7F",
                                 "white", "#FF7F00", "red", "#7F0000"))
dx <- 1500                    # 定义宽度。
dy <- 1400                    # 定义高度。
C  <- complex(real = rep(seq(-2.2, 1.0, length.out = dx), each = dy),
              imag = rep(seq(-1.2, 1.2, length.out = dy), dx))
C <- matrix(C, dy, dx)       # 重制形状为复数的方块矩阵。
Z <- 0                       # 初始化Z为零。
X <- array(0, c(dy, dx, 20)) # 初始化输出3D数组。
for (k in 1:20) {            # 循环具有20次迭代。
  Z <- Z^2 + C               # 中心差分方程。
  X[, , k] <- exp(-abs(Z))   # 捕获结果。
}
write.gif(X, "Mandelbrot.gif", col = jet.colors, delay = 100)
```

## 参见

- RStudio - R语言的集成开发环境（IDE）
- SPSS - 另一种统计分析软件
- Stata - 另一种统计分析软件
- SAS系统 - 另一种统计分析软件
- S-PLUS - 同样建基于S语言的统计分析软件

## 基本资料

- 日语原文：R
- 编程范型：多重编程范式：阵列式、物件导向、函数式、反射式、指令式、过程式
- 发行时间：1993年
- 设计者：罗斯·伊哈卡和罗伯特·杰特曼
- 开发者：R核心开发小组
- 软件版本周期：4.6.1
- 软件版本周期：2026年6月24日，2026年6月24日
- 类型系统：动态类型
- 受影响于：S、Scheme、Lisp
- 施影响于：Julia
- wikibooks：R Programming
- 文件扩展名：.r、.rdata、.rds、.rda