第1章
快 速 入 门
如前言所述,R是一种针对统计分析和数据科学的功能全面的开源统计语言。它在商业、工业、政府部门、医药和科研等涉及数据分析的领域都有广泛的应用。
本章将给出R的简单介绍——如何调用、能做什么以及使用什么文件。这里只介绍你在理解后面几章的例子时所需的基础知识,具体的细节将会在后面的章节中加以介绍。
如果你的公司或大学允许,R可能已经安装在你的系统中。如果还没安装,请参考附录A中的安装指南。
1.1 怎样运行R
R可以在两种模式下运行:交互模式和批处理模式。常用的是交互模式。在这种模式下,你键入命令,R将显示结果,然后你再键入新的命令,如此反复进行操作。而批处理模式不需要与用户进行互动。这对于生产工作是非常有帮助的,比如一个程序必须定期重复运行,如每天运行一次,用批处理模式则可以让处理过程自动运行。
1.1.1 交互模式
在Linux或Mac的系统中,只需在终端窗口的命令行中键入R,就可以开始一个R会话。在Windows系统下,点击R图标来启动R。
启动后显示的是欢迎语,以及R提示符,也就是>符号。屏幕的显示内容如下:
现在就可以开始执行R命令了。这时候显示的窗口叫做R控制台。
举个简单例子,考虑一个标准正态分布,其均值为0且方差为1。如果随机变量X服从这个标准正态分布,那么它的取值将以0为中心,或正或负,平均值为0。现在要生成一个新的随机变量Y=|X|。因为我们已经取了绝对值,Y的值将不会以0为中心,并且Y的均值也将是正值。
下面来计算Y的均值。我们的方法基于模拟N(0,1)分布随机变量的取值:
这行代码将会生成100个随机变量,计算它们的绝对值,然后计算它们绝对值的均值。
标签[1]表示这行的第一项是输出结果的第一项。在这个例子中,输出结果只有一行(且只有一项),所以标签[1]显得有点多余。但是当输出结果有很多项会占据很多行时,这种标签会很有帮助。例如,输出结果有两行,且每行最多有6项,则第二行将会以标签[7]开头。
在这里,输出结果有10个数值,举例来说,第二行的标签[7]可以让你快速判断出0.687701是输出结果的第8项。
也可以把R的命令保存在文件里。通常,R代码文件都会有后缀.R或者.r。如果你创建一个名为z.R的文档,可以键入下面的命令来执行该文件中的代码:
1.1.2 批处理模式
有时候自动处理R会话能带来便利。例如,你可能希望运行一个用来绘图的R脚本,而不需要你亲自启动R来执行脚本,这时就要用批处理模式运行R。
举个例子,文件z.R中是绘图的代码,内容如下:
以#标记的部分是注释,它们会被R解释器忽略掉。注释的作用是以更易读的形式来提示代码的用途。
下面一步步讲解前面代码的作用:
调用pdf()函数告诉R我们想把创建的图形保存在PDF文件xh.pdf中。
调用rnorm()函数(rnorm代表random normal)生成100个服从N(0,1)分布的随机变量。
对这些随机变量调用hist()函数生成直方图。
调用dev.off()函数关闭正在使用的图形“设备”,也就是本例中的xh.pdf文件。这就是实际上把文件写入磁盘的机制。
我们可以自动运行上面的代码,而不用进入R的交互模式,只需要调用一条操作系统shell命令(例如通常在Linux系统中使用的$命令提示符)来调用R:
用PDF阅读器打开保存的文件,可看到直方图(这里展示的只是简单的不加修饰的直方图,R可以生成更加复杂的图形),这表明上面的代码已执行。
1.2 第一个R会话
用数字1、2、4生成一个简单的数据集(用R的说法就是“向量”),将其命名为x:
R语言的标准赋值运算符是<-。也可以用=,不过并不建议用它,因为在有些特殊的情况下它会失灵。注意,变量的类型并不是固定不变的。在这里,我们把一个向量赋值给x,也许之后会把其他类型的值赋给它。我们会在1.4节介绍向量和其他类型。
c表示“连接”(英文是concatenate)。在这里,我们把数字1、2、4连接起来。更精确地说,连接的是分别包含三个数字的三个一元向量。这是因为可以把任何数字看作一元向量。
接下来我们也可以这样做:
这样就把q赋值为(1,2,4,1,2,4,8)(没错,还包括了x的副本)。
我们来确认一下数据是不是真的在x中。要在屏幕上打印向量,只需直接键入它的名称。如果你在交互模式下键入某个变量名(或更一般的,某个表达式),R就会打印出变量的值(或表达式的值)。熟悉其他语言(比如Python)的程序员会觉得这个特性很熟悉。例如,输入下面的命令:
果然,x包含数字1、2、4。
向量的个别元素靠[ ]来访问。下面来看看如何打印x的第三个元素:
正如在其他语言里一样,称选择器(这里的3)为索引(index)或者下标(subscript)。这些概念与ALGOL家族的语言(比如C和C++)类似。值得注意的是,R向量的元素的索引(下标)是从1开始的,而非0。
提取子集是向量的一个非常重要的运算。下面是个例子:
表达式x[2:3]代表由x的第2个至第3个元素组成的子向量,在这里也就是2和4组成的子向量。
可以很容易求得本例中数据集的均值和标准差,如下:
这里再次展示了在命令提示符下键入表达式来打印表达式的值。在第一行,表达式调用的是函数mean(x)。函数的返回值会自动打印出来,而不需要调用R的print()函数。
如果想把求得的均值保存在变量里,而不是打印在屏幕上,可以执行下面的代码:
同样,我们来确认一下y是否真的包含x的均值:
正如前面提到过的,我们用#来加上注释,如下:
注释对于写有程序代码的文档是很有价值的,不过在交互式会话中注释也很有用,因为R会记录命令历史(1.6节会讨论这一点)。如果你保存了会话,之后又恢复会话,注释可以帮你回忆起当时在做什么。
最后,我们从R的内置数据集(这些数据集是用来做演示的)里取出一个做些操作。你可以用下面的命令得出一份这些数据集的列表:
其中一个数据集名为Nile,包含尼罗河水流量的数据。我们来计算这个数据集的均值和标准差:
我们还可以画出数据的直方图:
此时会弹出一个包含直方图的窗口,如图1-1所示。这幅图是极其简单的,不过R有各种可选的变量来修饰图形。例如,可以通过设定breaks变量来改变分组;调用hist(z,breaks=12)可以画出数据集z的带有12个分组的直方图;还可以创建更漂亮的标签、改变颜色,以及其他一些改变来创建更有信息量且吸引眼球的图形。当你更熟悉R之后,就有能力构建更复杂、绚丽多彩的精美图形。
图1-1 尼罗河数据的简单展示
最后调用q()函数以退出R(另一种方法是,在Linux中按下快捷键CTRL-D,或者在Mac中按下CMD-D):
最后一句提示是询问你是否希望保存变量以待下次运行时继续处理。如果回答y,则所有对象将会在下次启动R的时候自动加载。这是非常重要的特性,特别是在处理庞大的数据集或很多数据集时。回答y也会保存会话的命令历史。1.6节会继续介绍如何保存工作空间(workspace)和命令历史。
1.3 函数入门
和大多数编程语言一样,R语言编程的核心是编写“函数”。函数就是一组指令的集合,用来读取输入、执行计算、返回结果。
我们先定义一个函数oddcount(),以此简单介绍函数的用法。这个函数的功能是计算整数向量中奇数的个数。一般情况下,我们会用文本编辑器编写好函数代码并保存在文件中,不过在这个简单粗略的例子中,我们只需要在R的交互模式中一行行输入代码。接下来,我们还会在几个测试案例中调用这个函数:
首先,我们告诉R想定义一个名为oddcount的函数,该函数有一个参数x。左花括号引出了函数体的开始部分。本例中,每行写一条R语句。
在函数体结束前,R会用+作为提示符,而不是用平常的>,以提醒用户现在还在定义函数。(实际上,+是续行符号,不是新输入的提示符。)在你键入右花括号来结束函数体之后,R又恢复使用>提示符。
定义完函数之后,本例调用了两次oddcount()函数。由于向量(1,3,5)中有3个奇数,所以调用oddcount(c(1,3,5))的返回值为3。(1,2,3,7,9)有4个奇数,所以第二次调用的返回值为4。
注意,在R中取余数的求模运算符是%%,见上面例子中的注释。例如,38除以7的余数为3。
例如,我们看看下面代码的运行结果:
首先,把x[1]赋值给n,然后测试n是奇数还是偶数。如果像本例中那样,n是奇数,则计数变量k增加。接着把x[2]赋值给n,测试其是奇数还是偶数,以此类推,重复后面的过程。
顺便说一句,C/C++程序员也许会把前面的循环写成这样:
在这里,length(x)是x的元素个数。假设x有25个元素。则1:length(x)就是1:25,意思是依次取1、2、3、……、25。上面的代码也能奏效(除非x的长度为0),但是R语言编程的戒律之一就是要尽可能避免使用循环,如果不能避免,就要让循环更简洁。重新看看这段代码原来的版本:
它更简单清晰,因为我们不需要使用length()函数和数组下标。
在代码的末尾,我们使用了return语句。
这条语句把k的计算结果返回给调用它的代码。不过,直接像下面这样写也可以达到目的:
在没有显式调用return()时,R语言的函数会返回最后计算的值。不过,这个方法必须慎重使用,7.4.1节会详细讨论这个问题。
在编程语言的术语里,x是函数oddcount()的形式参数(英文名称是formal argument或formal parameter,简称“形参”)。在前面例子第一次调用函数时,c(1,3,5)称为实际参数(actual argument,简称“实参”)。这两个术语暗示了这样的事实:函数定义中的x只是个占位符,而c(1,3,5)才是在计算中实际用到的参数。同样,在第二次调用函数时,c(1,2,3,7,9)是实际参数。
1.3.1 变量的作用域
只在函数体内部可见的变量对这个函数来说是“局部变量”。在oddcount()中,k和n都是局部变量。它们在函数返回值以后就撤销了:
需要注意的是,R函数中的形式参数是局部变量,这点非常重要。比如运行下面的命令:
现在,假如oddcount() 的代码改变了x的值,则z的值不会改变。调用oddcount()之后,z的取值还和之前一样。在计算函数调用的取值时,R会把每个实际参数复制给对应的局部参数变量,继而改变那些在函数外不可见的变量的取值。本书第7章将详细介绍“作用域法则”,上面提到的这些只是简单的例子。
全局变量是在函数之外创建的变量,在函数内部也可以访问。下面是个例子:
这里的y就是全局变量。
可以用R的“超赋值运算符”(superassignment operator)<<-在函数内部给全局变量赋值,将在第7章详细介绍。
1.3.2 默认参数
R语言也经常用到“默认参数”。考虑下面这样的函数定义:
如果程序员没有在函数调用时给y设定一个值,则y将初始化为2。同理,z也有默认值TRUE。
现在考虑下面的调用:
这里,数值12是x的实际参数,而且我们接受了y的默认值2,不过我们覆盖了z的默认值,将其设定为FALSE。
上面这个例子也表明:与其他编程语言一样,R语言也有“布尔类型”,包括TRUE和FALSE两个逻辑值。
注意 R语言允许TRUE和FALSE缩写为T和F。不过,如果你有名为T或F的变量,那么为了避免麻烦还是最好不要使用这样的缩写形式。
1.4 R语言中一些重要的数据结构
R有多种数据结构。本节将简单介绍几种常用的数据结构,使读者在深入细节之前先对R语言有个大概的认识。这样,读者至少可以开始尝试一些很有意义的例子,即使这些例子背后更多的细节还需要过一段时间才能揭晓。
1.4.1 向量,R语言中的战斗机
向量类型是R语言的核心。很难想象R语言代码或者R交互式会话可以一点都不涉及向量。
向量的元素必须属于某种“模式”(mode),或者说是数据类型。一个向量可以由三个字符串组成(字符模式),或者由三个整数元素组成(整数模式),但不可以由一个整数元素和两个字符串元素组成。
第2章将详细介绍向量。
标量
标量,或单个的数,其实在R中并不存在。正如前面提到的,单个的数实际上是一元向量。请看下面的命令:
前面提到过,符号[1]表示后面这行的开头是向量的第一个元素,本例中为x[1]。所以可以看出,R语言确实把x当做向量来看,也就是只有一个元素的向量。
1.4.2 字符串
字符串实际上是字符模式(而不是数值模式)的单元素向量。
第一个例子创建了数值向量x,也就是数值模式的。然后创建了两个字符模式的向量:y是单元素(也就是一个字符串)的向量,z由两个字符串组成。
R语言有很多种字符串操作函数。其中有些函数可以把字符串连接到一起或者把它们拆开,比如下面的两个函数:
第11章将会介绍字符串的细节。
1.4.3 矩阵
R中矩阵的概念与数学中一样:矩形的数值数组。从技术层面说,矩阵是向量,不过矩阵还有两个附加的属性:行数和列数。下面是一些例子:
首先,使用函数rbind()(rbind是row bind的缩写,意思是按行绑定)把两个向量结合成一个矩阵,这两个向量是矩阵的行,并把矩阵保存在m中(另一个函数cbind()把若干列结合成矩阵)。然后键入变量名,我们知道这样可以打印出变量,以此确认生成了我们想要的矩阵。最后,计算向量(1,1)和m的矩阵积。你也许已经在线性代数课程中学过矩阵乘法运算,在R语言中它的运算符是*。
矩阵使用双下标作为索引,这点与C/C++非常相似,只不过下标是从1开始,而不是0。
R语言的一个非常有用的特性是,可以从矩阵中提取出子矩阵,这与从向量中提取子向量非常相似。例子如下:
第3章将会详细介绍矩阵。
1.4.4 列表
和R语言的向量类似,R语言中的列表也是值的容器,不过其内容中的各项可以属于不同的数据类型(C/C++程序员可以把它与C语言的结构体做类比)。可以通过两部分组成的名称来访问列表的元素,其中用到了美元符号$。下面是个简单的例子:
表达式x$u指的是列表x中的组件u。列表x还包含另一个组件v。
列表的一种常见用法是把多个值打包组合到一起,然后从函数中返回。这对统计函数特别有用,因为统计函数有时可能有复杂的结果。例如,考虑1.2节提到的R语言中基础直方图函数hist(),为R中内置的尼罗河数据集调用该函数。
这条语句生成了一幅直方图,不过hist()函数同样有返回值,可以这样保存:
hn里面是什么?我们来看看:
现在不要试图去理解上面的所有东西。现在需要知道的是,除了绘制直方图之外,hist()还会返回包含若干个组件的列表。在这里,这些组件描述了直方图的特征。例如,组件breaks告诉我们直方图里的直条从哪里开始到哪里结束,组件counts是每个直条里观测值的个数。
R语言的设计者把hist()返回的信息打包到一个R列表中,这样可以通过美元符号$来访问,并用其他R语言命令进行操作。
要打印hn,也可以直接键入它的变量名:
另一种打印列表的较为简洁方式是使用str()函数:
这里的str代表structure(结构)。这个函数可以显示任何R对象的内部结构,不只限于列表。
1.4.5 数据框
一个典型的数据集包含多种不同类型的数据。例如在一个员工数据集里,可能有字符串数据(比如员工姓名),也可能有数值数据(比如工资)。因此,如有一个50个员工的数据集,其中每个员工有4个变量,虽然这样的数据集看起来像是50行4列的矩阵,但是这在R语言中并不符合矩阵的定义,因为它混合了多种数据类型。
此时应该用数据框,而不是矩阵。R语言中的数据框其实是列表,只不过列表中每个组件是由前面提到的“矩阵”数据的一列所构成的向量。实际上,可以用下面的方式创建数据框:
不过,通常数据框是通过读取文件或数据库来创建的。
本书第5章将详细介绍数据框。
1.4.6 类
R语言是一门面向对象的编程语言。对象是类的实例。类要比你目前见过的数据类型更加抽象。本节将简单介绍S3类的使用。(名称来源于第三代S语言,这是R语言的灵感来源。)大多数R对象都是基于这些类,并且它们非常简单。它们的实例仅仅是R列表,不过还附带一个属性:类名。
例如,前面提到的直方图函数hist()的(非图形)输出是一个包含多个组件的列表,而break和count都是它的组件。它还有一个“属性”(attribute),用来指定列表的类,即histogram类。
读到这里,你可能会产生疑问:“如果S3类的对象都是列表,那为什么还需要类的概念?”答案是,类需要用在泛型函数中。泛型函数代表一个函数族,其中每个函数都有相似的功能,但是适用于某个特定的类。
一个常用的泛型函数是summary()。如果R用户想使用统计函数,如hist(),但是不确定怎样处理它的输出结果(可能会输出很多内容),输出结果不仅仅是个列表,还是个S3类,这时可以对输出结果简单地调用summary()函数。
反过来说,summary()函数实际上是生成摘要的函数族,其中每个函数处理某个特定的类。当你在某个输出结果上调用summary()函数,R会为要处理的类寻找合适的摘要函数,并使用列表的更加友好的方式来展示。因此,对hist()的输出结果调用summary()函数会生成与之相适应的摘要,而对回归函数lm()调用summary()时也会生成与之相适应的摘要。
plot()函数是另一个泛型函数。你可以对任何一个R对象使用plot()函数,R会根据对象的类寻找合适的画图函数。
类也可以用来组织对象。类与泛型函数结合使用,可以开发出灵活的代码,以处理各种不同的但是相关联的任务。第9章将讨论关于类的更深层次的话题。
1.5 扩展案例:考试成绩的回归分析
在接下来的案例中,我们会从头到尾进行一个简单的统计回归分析。这个例子实际上没有多少编程技术,不过它说明了如何使用前面提到的一些数据结构,包括R的S3对象。同样,它在后面的章节里也充当了编程案例的基础。
ExamsQuiz.txt文件包含了我所教班级的成绩。下面是该文件的前几行:
数字表示的是学生成绩的学分绩点。比如绩点3.3对应的就是平常所说的B+。每一行包含的是一个学生的数据,由期中考试成绩、期末考试成绩和平均小测验成绩组成。此例的兴趣点在于用期中考试成绩和平均小测验成绩来预测期末成绩。
先来读入数据文件。
这个数据文件的第一行不是记录的变量名,也就是说没有表头行,所以在函数调用中设定header=FALSE。这是前文提到过的关于默认参数的一个例子。实际上,表头参数的默认值已经是FALSE了(关于这一点,可以在R里查看函数read.table()的在线帮助),所以没必要做前面那样的设定,不过这样做会更明了。
数据现在在examsquiz中,它是数据框类的R对象。
为了检查数据文件刚才是否已读入,查看一下数据的前几行:
由于缺少数据表头行,R自动把列名设置为V1、V2和V3。行号出现在每行的最左边。可能你会觉得数据文件有表头比较好,用有意义的名称(比如Exam1)来标识变量。在后面的例子中,我们通常会设定变量名。
我们来用期中考试成绩(examsquiz的第一列)预测期末考试成绩(examsquiz的第二列):
这里调用lm()函数(lm是linear model的缩写),让R拟合下面的预测方程:
期末考试成绩预测值=β0+β1×期中考试成绩
其中,β0和β1都是用本例的数据估计出来的常数。换句话说,我们用数据中的数对(期中考试成绩,期末考试成绩)拟合了一条直线。拟合过程是用经典的最小二乘法来完成的。(如果你没有相关的背景知识也不用担心。)
注意,存储在数据框第一列的期中考试成绩是用examsquiz[,1]表示,省略了第一维的下标(代表行号)表示我们引用的是数据框的一整列。期末考试也是用类似的方式引用的。这样,我们调用上面的lm()命令,利用examsquiz的第一列来预测第二列。
也可以这样写:
前面提到过,数据框是种各元素都为向量的列表。在这里,各列是列表的组件V1、V2和V3。
lm()的返回结果现在是保存于变量lma中的对象。它是lm类的一个实例。可以调用attributes()函数列出它的所有组件。
和往常一样,调用str(lma)可以得到lma的更详细说明。βi的估计值保存在lma$coefficients中。在命令提示符下键入系数的变量名就可以显示系数。
在键入组件名时也可以使用缩写形式,只要缩写后的组件名不发生混淆即可。例如,如果一个列表由组件xyz、xywa和xbcde构成,则第二个和第三个组件的名称可以分别缩写为xyw和xb。因此我们可以键入下面的命令:
因为lma$coefficients是一个向量,所以比较容易打印。但是当打印对象lma本身的时候是这样的:
为什么R只打印出这些项,而没有打印出lma的其他组件?这个问题的答案是,R在这里使用的print()函数是另一个泛型函数的例子,作为一个泛型函数,print()实际上把打印的任务交给了另一个函数——print.lm(),这个函数的功能是打印lm类的对象,即上面函数展示的内容。
可以用前面讨论过的泛型函数summary()打印输出lma的更详细的内容。它实际上在后台调用了summary.lm(),得出针对某个特定回归模型的摘要:
许多其他泛型函数都是针对这个类定义的。可以查看在线帮助来获取关于lm()的更多细节。(1.7节将讨论如何使用R的在线文档。)
要用期中考试成绩和测验成绩预测期末考试成绩,可以使用记号+。
注意,+号并不表示计算两个量的和。它仅仅是预测变量(predictor variable)的分隔符。
1.6 启动和关闭R
与很多成熟完善的应用软件类似,用户可以在启动文件中自定义R的行为。另外,R可以保存全部或者部分会话,比如记录你用R做过什么,并输出到文件里。如果希望每次开始R会话的时候执行一些R命令,那么你可以把这些命令保存到.Rprofile文件中,并把该文件放置于你个人的主目录或者当前运行R的目录下。当然R搜索.Rprofile文件时会最先搜索后一个目录,这样就可以针对特定的项目进行自定义配置。
例如,要设置调用edit()时R启动的文本编辑器,你可以在.Rprofile文件中加入下面的这一行(如果你使用的是Linux系统):
options()函数用来配置R,也就是调整各种设置。可以使用与你的操作系统相对应的符号(斜杠或反斜杠)来设定编辑器的完整路径。
另一个例子,在我家Linux电脑里的.Rprofile文件中,有这么一行:
这条命令会在R的搜索路径中自动添加一个包含我的全部辅助包的目录。
与大多数程序一样,R也有当前工作目录(current working directory)的说法。如果你使用的是Linux或者Mac系统,当前工作目录就是你启动R时的目录。在Windows中,当前工作目录很可能是“我的文档”目录。如果此时在R会话中引用文件,则会认为文件在那个目录下。可以键入下面的命令查看当前工作目录:
可以调用setwd()函数来修改工作目录,并将目标目录作为参数。例如:
这条命令会把工作目录设置为q。
和在进行交互式R会话时一样,R会把你提交的命令记录下来。当退出R时,R会询问你“是否保存工作空间映像?”,如果你回答“是”,则R会保存你在本次会话中所创建的所有对象,并在下次会话中恢复。这意味着下次你可以从上次停止的地方继续,而不必从头开始。
工作空间保存于名为.Rdata的文件中,该文件位于启动R会话的位置(Linux下)或者R的安装目录下(Windows下)。.Rhistory文件用来记录你之前用过的命令,查看该文件可以帮助你回忆工作空间是如何创建的。
如果想更快地启动或关闭R,那么在启动R时使用vanilla选项可以跳过加载上面那些文件以及结束时保存会话的过程。
其他选项介于vanilla和“加载所有文件”之间。要查找更多关于启动文件的信息,可查询R的在线帮助,如下:
1.7 获取帮助
有很多种资源可以帮你学习关于R的更多知识,其中包括R自身的一些工具,当然,还有网上的资料。
开发者们做了很多工作使R更加自文档化。下面我们将介绍一些R内置的帮助工具,以及互联网上的资源。
1.7.1 help()函数
想获取在线帮助,可调用help()。例如,要获取seq()函数的信息,就键入下面的命令:
调用help()的快捷方式是用问号(?):
在使用help函数时,特殊字符和一些保留字必须用引号括起来。例如,要获取<运算符的帮助信息,必须键入下面的命令:
想查看在线帮助是如何讲解for循环的,要键入:
1.7.2 example()函数
每个帮助条目都附带有例子。R的一个非常好用的特性是,example()函数会为你运行例子代码。示例如下:
sep()函数可以生成多种等差数值序列。运行example(seq)让R展示若干个seq()的例子。
想象一下这对绘图多么有帮助!如果你想看看R的某个绘图函数的功能,example()函数会给你一个“图形化”的演示。
下面的命令将给出一个简单且精美的例子:
它会展示persp()函数的一系列样图。其中一幅如图1-2所示。当你准备浏览下一幅图时,只需在R的控制台中按下回车键。注意,每个例子的代码都会在控制台中显示,所以你可以试着调整参数。
图1-2 persp()函数的一个例子
1.7.3 如果你不太清楚要查找什么
你可以使用help.search()函数在R的文档中进行Google风格的搜索。比如,你需要一个生成多元正态分布的随机变量的函数。为了确定哪个函数能达到目的,你可以尝试使用下面的命令:
我们会得到一个反馈信息,包含下面的摘要:
可以看到,包MASS中的函数mvrnorm()可以完成任务。
help.search()还有个快捷方式:
1.7.4 其他主题的帮助
R的内部帮助文件不仅限于特定函数的页面。例如,前一节提到的函数mvrnorm()在包MASS中。可以键入下面的命令获取这个函数的信息。
键入下面的命令,你还可以得到整个包的信息:
还可以获得一般主题的帮助。例如,如果你对文件感兴趣,就键入下面的命令:
它会给出很多文件操作函数的信息,比如file.create()。
下面是一些其他主题:
你可能会发现浏览这些主题会很有帮助,甚至可以漫无目的地浏览。
1.7.5 批处理模式的帮助
前面提到过,R的批处理命令允许你直接在操作系统的shell中运行命令。要获取某个批处理命令的帮助,可以键入:
例如,要查询INSTALL命令(附录B将介绍)的所有相关选项,可以键入:
1.7.6 互联网资源
在网上有很多关于R的优秀资源。以下是其中部分资源:
R语言主页(
http://www.r-project.org/)上提供了R项目的手册,点击Manuals即可浏览。
R语言主页上还列出了多种R语言的搜索引擎,点击Search即可。
R包sos能够对R语言的材料进行精密搜索,可按照附录B的说明来安装R包。
我经常使用RSeek搜索引擎:
http://www.rseek.org/ 。
你可以在R语言的邮件列表服务器r-help上发信提问。可以在
http://www.r-project.org/mail.html上获取这个以及其他邮件列表的信息。有多种界面可供选择。我喜欢用Gmane (
http://www.gmane.org/)。
由于R语言的名称只是一个字母,所以很难在通用搜索引擎(比如Google)上搜索到相关信息。不过还是可以用些技巧来解决。一种方法是使用Google的文件类型准则。比如要搜索关于permutations 的R语言脚本(文件名后缀是.R),输入:
选项-rebol是要求Google排除关于“rebol”的页面,这是因为编程语言REBOL也有相同的后缀。
CRAN(R语言综合资料网,网址为
http://cran.r-project.org/)是一个存放用户捐献的R代码的网站,所以这是一个很好的Google搜索词。例如,搜索“lm CRAN”会帮你找到R语言中关于lm()函数的资料。