1.2 R是什么

R有时会以两种不同的面孔出现:R编程语言及运行R程序的软件。乍一看可能会让人难以辨认,不过,大多数情况下都能够通过上下文,清楚地知道其中的R指的是什么。

R语言由奥克兰大学的Ross Ihaka和Robert Gentleman在20世纪90年代初开发。它源于20世纪70年代John Chambers在贝尔实验室带头开发的S语言。R软件是一个GNU项目,这表明它是一个重要的自由开源软件。现在的R语言和软件都由一个(目前)20人的R核心团队(R Core Team)开发。

R的历史可追溯到上世纪70年代,这一点非常重要,因为它在过去的几十年里不断演化,仿佛生命体一般,在演化过程中曾出现各种奇怪和矛盾的地方。与之相比,微软的.NET Framework更有一种“横空出世”1的感觉。R这种形式更为自由(尤其是自由许可证)的好处是,如果你不喜欢现有R的做法,完全可以重写一个包,使它按照你的想法去做。现在已经有很多人这样做了,如今常见的问题不是“我能使用R做到这一点吗”,而是“我应该用这三种实现中的哪一种”。

1 精心设计的结果?

R是一种解释型语言(有时也称为脚本语言),这意味着代码在运行之前并不需要编译。作为一种高级语言,R旨在更快捷、更强大地为你分析数据,你无需知道代码如何运行于计算机底层这样的细节。

R支持混合型的编程范式。它的核心是一种命令式语言(写一个脚本来逐条执行计算命令),但它也支持面向对象编程(数据和函数都绑定在类的内部)和函数式编程(函数是第一类对象,你可以像对待其他任何变量一样对待它们,而且也可以递归调用它们)。这种混合式的编程风格意味着R能拥有类似其他语言的特性。大括号意味着你可以编写看起来像C语言的命令式代码(但第2章将介绍的R的矢量特征会使它只需要更少的循环)。如果使用引用类,就可以写出有点像C#或Java的面向对象代码。函数式编程结构是受了Lisp的启发(变量的作用域规则取自Lisp的方言Scheme),不过括号更少。所有这些其实都是在暗示R遵循Perl的理念Perl ethos:  

我们可以用多种方法来实现。

——Larry Wall