Likan Zhan

第 1 章、对象、函数和接口

侃侃迩行 · 2017-02-15

作者希望借助本书,鼓励和协助R使用者对R软件进行拓展。R的每一项拓展,无论对于拓展者还是对于整个社群而言,都是非常有价值的。

在某种程度上,每一个R语言的严肃使用者都可能在拓展R。R在设计上使得对它的拓展非常容易。R语言的一些基本拓展形式包括定义一个或几个新的函数等。任何一本介绍性书籍或在线手册都会介绍如何定义一个新函数,这里就不做过多解释了。

这也许是到目前为止你需要探索的,尤其是当你刚刚开始接触R的时候。但本书所说的“拓展”却不仅仅是定义一个函数。我所定义的拓展要要有更复杂的含义。基于此定义,你对R的扩展,无论对于你还是对于其他人来讲,将具有更广的影响范围和更大的潜在价值。

我的一个基本论点是,更有野心的拓展将得益于使用者对R的底层设计的理解。本章将介绍用于封装R语言底层设计的三个基本原则。这三个原则反映了有关R、S语言以及其前身的基本事实。设计者希望用这三个原则给用户提供一个最直接和最有效的数据计算软件。

正确理解R将有助于使用者创造出与它的核心能力相符的拓展。正确理解R还会使得该创造过程更加容易、更易有收获,使得拓展的结果更具价值。

1.1 三个原则

下面三个命题是理解R语言的三个基本原则,也是我们拓展R的基本指导思想。这三个原则也是S语言、其后继者R语言、以及这些语言的前身的核心思想。

下面就是这三个原则的基本表述形式,以及本书中用于指代这三个原则的名称。

这三个原则的详细信息和应用在本书中将不断出现。

R语言对所有对象的表征都有一个一致性的内在结构。评估过程将以非常简单的形式切断(key off)该结构将以该结构。该评估过程的核心组成部分是以其他对象为参数(arguments)和另外一个对象为输出值的函数调用(function calls)。

R以及其前身S一直明确的坚持这么一个概念:该语言是以一系列计算工具为根基建立起来的。因为R函数能与其他语言的软件进行交流或者交换对象,所以R的执行也遵循对象原则和函数原则。在最初阶段,这两个原则给计算方法提供了重要的应用工具,以使得这个新系统有应用价值。接口原则继续成为R语言严肃拓展的一个核心策略。

前两个原则与计算系统中两个一般的范式相对应:面向对象的编程(object-oriented programming)和功能编程(functional programming)。长久以来,这都是两种最多产和最流行的编程范式。编程语言的多个领域的应用,以及多种编程语言和系统都是基于或者受其中一个或另一个影响,尤其是OOP。

面向对象编程在处理复杂问题上价值尤其大。 用OOP的方式结构化数据,对数据进行计算,使得软件能够在保持简洁性和可读性的同时能够不断进化以满足某些特殊化的要求。

功能编程技术是高质量、可靠性软件的基础。该编程技术能展现一个软件的目的,并以一种有效的计算来支撑该目的。当软件的质量是对理论基础或重要应用的探寻使,该支撑就是有价值的。例如,它能够保证多重函数调用能够以平行的方式被评价。

统计计算,作为本书关注的核心,与这两种范式都有都有一种天然的联系。但是R语言有自己的路径。发展到今天的R语言与其他语言不一样甚至是独一无二的地方在于它把功能编程的不同方面和不同版本的OOP。第1章第5节和第1章第6节介绍了功能编程和面向对象的编程。该介绍非常简单,但却是本书接下来要系统探寻的方式。

这两种编程的基本思想都非常重要,但是R却采取了一个其他语言不同的方式来处理。以我个人的经验而言,理解如何和为什么,将有助于避免混淆,尤其是你的在其他语言中的编程基础非常基本的时候。

我将把R所使用的方法叫做以对象为基础的函数计算(functional, object-based computing)。函数计算和以对象为基础的计算是函数编程和面向对象编程的天然基础,但是比他们宽松。正如他们在R中的应用,这两种计算都不是正式的编程范式。

R语言的方法部分地反映了其自身的进化。第二章讨论了该进化,以论证或者至少是解释R采取该方法的合理性。

以这三个原则和其自身的进化为背景知识,第三章介绍了在实践过程中,这些方法是如何工作的。第而部分和第四部分先从一般意义上进行,再从面向对象的编程和接口的角度详细介绍了如何对R进行拓展。

1.2. 任何存在于R中的都是R的对象

1.3. 任何发生于R中的都是R的函数调用

1.4. 与其他软件的接口是R的一部分

1.5. 函数式编程

1.6. 面向对象的编程