R 语言定义.docx
《R 语言定义.docx》由会员分享,可在线阅读,更多相关《R 语言定义.docx(70页珍藏版)》请在冰豆网上搜索。
R语言定义
Next:
Notes,Previous:
(dir),Up:
(dir)
R语言定义
乔呼和整理上传
本册主要对R语言,赋值解释(explainingevaluation),解析,面向对象编程,语言上的计算等方面进行一个介绍。
本文档的当前版本为0.01β草稿。
该文档译自R-2.3.1文档(2006年6月1日)。
丁国徽(ghding@)译。
本文档的一些发布信息放置在http:
//www.biosino.org/R/R-doc/。
ISBN3-900051-13-5
∙Notes:
说明
∙Introduction:
绪论
∙Objects:
对象
∙Evaluationofexpressions:
表达式求值
∙Functions:
函数
∙Object-orientedprogramming:
面向对象编程
∙Computingonthelanguage:
语言上的计算
∙Systemandforeignlanguageinterfaces:
系统和其它语言的接口
∙Exceptionhandling:
异常处理
∙Debugging:
调试
∙Parser:
解析器
∙FunctionandVariableIndex:
函数和变量索引
∙ConceptIndex:
概念索引
∙References:
参考文献
1绪论
R是为统计计算和图形展示而设计的一个系统。
它包括一种编程语言,高级别图形展示函数,和其它语言的接口以及调试工具。
本手册将会详细描述和定义R语言。
R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支。
S的主要设计者JohnM.Chambers因为S语言方面的工作获得了1998年ACM软件系统奖(ACMSoftwareSystemsAward)。
该语言的语法表面上类似C,但在语义上是函数设计语言的(functionalprogramminglanguage)的变种并且和Lisp以及APL有很强的兼容性。
特别的是,它允许在“语言上计算”(computingonthelanguage)。
这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。
通过命令行运行简单的表达式可以充分地交互使用R的功能。
一些用户可能这样做就能满足要求了,但还有一些用户想编写他们自己的函数。
编写函数的用户要么用以一种特别的方式,系统化一些常常重复的工作或者为新的功能编写扩展包。
本手册的目的是想记录R语言的本质。
也就是它所工作的对象,表达式赋值过程的细节。
这些内容的了解对编写R函数非常有用。
另外一些针对特定任务的主题,如绘图,在本册里面只是简单描述,而在其它手册里面有专门的论述。
尽管手册中的大部分内容同样适用于S,但S和R还是有一些实质上的差异。
为了不至于混淆,我们集中描述R。
R语言的设计包含了一系列亮点,当然也有让用户惊讶的公共缺陷。
许多设计是基于底层的连贯性考虑,我们会在后面的行文中解释。
它还包括很多有用的快捷方式和特殊用法,使得用户可以很简洁的表述复杂的操作。
一旦用户熟悉底层的概念,这些用法将会变得非常的自然。
在某些情况下,有多种方法完成同一件事情,但是其中有些技术依赖于语言的实现,另外一些技术则是一个更高层次上的抽象。
在这种情况下,我们会指出首选的用法。
读本册前,我们假定用户对R已经有一定的了解。
这不是一本R的入门读物,而是一本程序员的参考手册。
其它文档给出了互补的信息:
特别Preface(RIntroduction)给出R语言的入门介绍和Systemandforeignlanguageinterfaces(WritingRExtensions)详细介绍如何用编译好的代码扩充R语言。
2对象
在所有编程语言中,变量提供了一种访问内存中数据的方法。
R没有提供直接访问计算机内存的方法,但提供了许多我们称之为对象的特殊数据结构。
这些对象通过变量或者符号(symbol)访问。
不过在R语言里面,符号本身就是对象并且和使用其它对象一样的方式使用。
这和许多其它语言不同,但有广泛的影响。
在本章,我们会给出R里面各种数据结构的初步描述。
对这些数据结构更为详细的讨论会在后面的章节中展开。
R语言特有的函数typeof返回R对象的类型。
注意在R底层的C代码中,所有对象都是指向一个有类型定义SEXPREC的结构体(structure)的指针;不同的R数据类型在C里面用决定结构体各部分信息的SEXPTYPE表示。
下面的表格描述了typeof可能的返回值以及它们的涵义。
NULL
空
symbol
一个变量名字
pairlist
成对列表对象
closure
一个函数
environment
一个环境
promise
一个用于实现悠闲赋值的对象
language
一个R语言构建
special
一个不可针对参数求值的内置函数
builtin
一个可针对参数求值的内置函数
logical
含逻辑值的向量
integer
含整数值的向量
double
含实数值的向量
complex
含复数值的向量
character
含字符值的向量
...
特定变量长度参数***
any
一个可以匹配任何类型的特殊类型***
expression
一个表达式对象
list
一个列表
externalptr
一个外表指针对象
weakref
一个弱引用对象(aweakreferenceobject)
raw
一个字节元素向量
我认为用户不用深入以`***'标记的条目,至少没有想象的那么容易;但是可以多看一些例子。
根据Becker,Chambers&Wilks(1988)中的说明,函数mode返回对象的模式信息,并且和其它S语言的变种完全兼容。
最后,同样基于Beckeretal.(1988)的考虑,函数storage.mode返回其参数的存储模式(storagemode)。
该函数常常用于,在外部语言(如C或FORTRAN)中调用函数时确保R对象有被调用的程序所期望的数据对象。
(在S语言里面,整数值或实数值向量都是"numeric"模式,因此它们的存储模式需要区分。
)
>x<-1:
3
>typeof(x)
[1]"integer"
>mode(x)
[1]"numeric"
>storage.mode(x)
[1]"integer"
R在计算过程中,对象常常需要强制转换成不同的类型(type)。
有许多函数可用于显式的强制转换。
在仅仅用R语言编程的时候,一个对象的类型通常不会影响计算结果,但是当混合使用外部编程语言或不同的操作系统时,常常需要保证对象类型的正确。
∙Basictypes:
基本类型
∙Attributes:
属性
∙Specialcompoundobjects:
特殊的混合对象
2.1基本类型
∙Vectorobjects:
向量对象
∙Listobjects:
列表对象
∙Languageobjects:
语言对象
∙Expressionobjects:
表达式对象
∙Functionobjects:
函数对象
∙NULLobject:
空对象
∙Built-inobjectsandspecialforms:
内置对象和特别形态
∙Promiseobjects:
允诺对象
∙Dot-dot-dot:
...对象
∙Environmentobjects:
环境对象
∙Pairlistobjects:
成对列表对象
∙Any-type:
任意类型
2.1.1向量
向量可以看着是由一系列包含数据的紧密联结的单元格子构成。
这些单元格通过类似x[5]的索引操作来访问。
更细节的内容可以参考Indexing。
R有六个基本(`原子性')向量类型:
逻辑型,整数型,实数型,复数型,字符串(字符)型和原味型(raw)。
这些不同向量类型的模式和存储模式如下表所示。
typeof
mode
storage.mode
logical
logical
logical
integer
numeric
integer
double
numeric
double
complex
complex
complex
character
character
character
raw
raw
raw
单个的数字,如4.2,以及字符串,如"fourpointtwo",仍然是长度为1的向量,因为没有更基本的数据类型了。
零长度向量是允许的(也是非常有用的)。
字符串向量的模式和存储模式都是"character"。
字符向量的单个元素常常是字符串。
2.1.2列表
列表(“广义向量”)是另外一种数据存储方式。
列表含有元素,每一个元素可以是任意R对象类型,也就是说,列表的各个元素可以是不同的数据类型。
列表元素的访问可以通过三个不同索引操作实现。
这些在Indexing部分将会详细介绍。
列表是向量,并且在不能使用列表时,基本的向量类型可以转换为原子向量。
2.1.3语言对象
三种对象类型构成了R语言的全部。
它们分别是调用类型(calls),表达式类型(expressions)和命名类型(names)。
既然R有"expression"类型的对象,所以我们应该尽量避免在其它地方使用“表达式”这个词。
需要注意的是,语法上正确的表达式会被看作是程序语句(statements)。
这些对象分别有"call","expression",和"name"三种模式。
这些对象可以利用quote机制从表达式直接创建,并且可以通过函数as.list和as.call与列表相互转换。
解析树的分量可以通过标准的索引操作析取。
∙Symbolobjects:
符号对象
2.1.4表达式对象
在R里面,我们可以创建类型为"expression"的对象。
一个表达式(expression)含有一个或多个程序语句。
其中,程序语句(statement)指的是语法上正确的一群标记的聚集。
表达式对象是一种特殊语言对象,它包含一些解析过但还未求值的R语句。
相比其它语言对象,它的主要差别在于一个表达式对象可以包含多个同类型的表达式。
另外一个更细微的差别是,"expression"类型的对象仅仅当它显式地传递给函数eval时才求值,而其它语言对象可在一些意想不到的情况下求值。
表达式对象的操作行为非常像列表,它的元素访问方式和列表元素的访问方式一样。
2.1.5函数对象
在R里面,函数是对象并且可以有许多和其它对象类似的操作方法。
函数(更准确地说是函数闭包(functionclosure))有三个基本的组成部分:
形式化的参数列表,功能实现的主体和环境。
参数列表是一个以逗号分割的参数的列表。
参数可以是符号,或者是symbol=default的形式,或者是特殊参数...。
第二种参数形式常常用于设置参数的默认值。
如果函数调用时参数缺省,该值会被采用。
...参数比较特殊,而且可以包含任意多的