R语言入门经典

978-7-115-47629-6
作者: 【英】安迪 尼古拉斯(Andy Nicholls) 理查德 皮尤(Richard Pugh) 艾梅 戈特(Aimee Gott)
译者: 姜佑
编辑: 傅道坤
分类: R语言

图书目录:

详情

本书作为R语言的入门教程,采用直观、循序渐进的方法讲解了R语言在数据统计/分析中的用法,读者将学会如何对数据进行导入、操纵、汇总、建模和绘制,如何掌握完整的数据分析流程,如何构建高效、可复用、可与他人分享的代码,还将学会如何使用书中的最佳做法来自行构建R软件包。

图书摘要

版权信息

书名:R语言入门经典

ISBN:978-7-115-47629-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [英] Andy Nicholls Richard Pugh Aimee Gott

译    姜 佑

责任编辑 傅道坤

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Andy Nicholls, Richard Pugh, and Aimee Gott: Sams Teach Yourself R in 24 Hours

ISBN: 0672338483

Copyright © 2016 by Pearson Education, Inc.

Authorized translation from the English languages edition published by Pearson Education, Inc.

All rights reserved.

本书中文简体字版由美国Pearson公司授权人民邮电出版社出版。未经出版者书面许可,对本书任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


本书作为R语言的学习指南,详细讲解了R语言的基本概念和编程技巧。本书从最基础的知识开始,由浅入深地介绍R的基本概念和重要特性,并用大量的示例和图形进行演示和说明,旨在让读者在掌握R语言的同时,能养成良好的编程习惯,写出专业、高效的代码。

全书共24章,其内容涵盖了R语言的社区和环境介绍;R语言的各种数据结构(单模式/多模式数据结构,日期、时间和因子);包括各种常用函数、实用函数和应用函数在内的R语言函数;如何在R中进行文本的导入和导出,如何操控和转换数据,以及在R中高效处理数据的方法;如何可视化数据(涵盖了三个基本图形系统、ggplot2图形系统和Lattice图形系统);如何用R构建线性模型、广义线性模型和非线性模型,以及面向对象的思想;如何进行R代码提速(包括代码的性能分析和提速方法);如何构建R包和扩展R包;如何编写R类,其中会涉及R中的面向对象编程系统(S3、S4、引用类等);如何创建动态报告和如何用Shiny创建网络应用程序。本书附录还介绍了R、Rtools和RStudio的具体安装步骤。

本书涵盖了R语言的所有基础知识,介绍了许多实用的编程技巧,既可作为R语言的入门教材,也可作为一本为寻求拓宽分析工具的专业统计学家、数据科学家、分析师量身打造的学习宝典。本书还可作为对R语言感兴趣的读者和开发人员的参考书籍。


Andy Nicholls在英国斯巴大学获得数学硕士学位,在南安普顿大学获得统计学应用科学硕士学位。Andy在2011年加入Mango Solution公司之前一直是一位制药行业的资深统计学家。自从加入Mango Solution后,Andy举办了50多次R语言的现场培训课程,参与了30多个R包的开发。现在,他负责管理Mango Solution的R顾问团队,并一直定期为每季度的LondonR活动做贡献。到目前为止,该活动的R用户组参与人数居英国之首,有1000多个见面会成员。Andy与他美丽贤惠的妻子和可爱的儿子居住在英国的历史名城巴斯附近。

Richard Pugh在巴斯大学获得数学学位。Richard在制药行业作为统计学家从事统计相关工作多年,后来加入了Insightful公司(开发了S-PLUS)的售前顾问团队。Richard在Insightful公司的工作包括举办各种活动,给许多行业的蓝筹客户提供相关的培训和咨询服务。Richard在2002年作为联合创始人创建了Mango Solution,领导公司中R和其他分析软件的各种项目开发和技术研发。Richard现在是Mango公司的首席数据科学家,定期在数据科学会议和R活动中发言。Richard与他的妻子和两个孩子居住在英国威尔特郡西部的Bradford on Avon镇,大部分“业余时间”都在修整自己的房子。

Aimee Gott是兰卡斯特大学的统计学博士,在本校获得了本科和硕士学位。作为培训领导,Aimee为Mango公司举办了200多天的培训。她在欧洲和美国举办了多次全面介绍R语言的现场培训,而且还包括许多短期研讨会和在线研讨会。Aimee负责监督Mango公司跨数据科学领域方面的培训课程开发,并定期参加R用户组和见面会。在业余时间里,Aimee喜欢学习各种欧洲语言,并用摄影记录她的旅行。


本书献给我挚爱的妻子,感谢她的理解和支持。很抱歉每天不得不忙到深夜,整个夏天都不能好好陪她。献给我的宝贝儿子,在撰写本书的过程中,他学会了自己坐起来、吃饭、到处爬,学会了自己走路!

—— Andy Nicholls

本书献给我的家人,很遗憾每个周末都不能陪他们。

—— Richard Pugh

献给Stephen、Carol、Richard和Kristie。

—— Aimee Gott


Mango Solutions公司一直以来致力于对专业学者和商务人士面授R培训课程,已经超过13个年头。我们目睹了R从早期作为S-PLUS和SAS的廉价替代品,成长为当今世界领先的分析编程语言。成千上万的贡献者源源不断地加入,数以百万计的用户日益增加。R在各个学术界都备受青睐,而且获得了微软、谷歌、惠普、甲骨文等大型公司的商业支持。

在Mango公司的面授培训计划中,我们的R培训对象有统计学家、数据科学家、物理学家、生物学家、化学家、地理学家、心理学家等各领域的专家学者。为了提高在专业环境中分析数据的能力,大家都求助于R。我们撰写本书的目的是,把我们的内部培训资料公布出来,为更多有志学好R从事数据分析的人和所有对R感兴趣的人提供学习资源和帮助。

本书是为通过学习R寻求拓宽分析工具的专业统计学家、数据科学家、分析师量身打造的学习宝典。如果读者能有一定的其他数据分析语言或分析应用程序的编程经验(如SAS、Python或Excel/VBA),学起来会很轻松。但是,这不是硬性要求,即使没有数据分析和编程背景,也没有关系。本书同样适合于没有任何编程经验的初学者。我们从一开始就假设读者没有任何R基础。只不过,如果熟悉R的基础知识,可以跳过前面章节,直接阅读后面感兴趣的章节。

本书从R语言的基础知识开始,由浅入深地详细介绍了到数据科学中的常见任务,包括数据操控、数据可视化和数据建模。结合R语言的特性,介绍了如何编写出高质量、可读性好的产品级代码。作为培训教程,本书有大量简单易懂的示例,所有示例可在本书的网站(http://www.mangosolutions.com/wp/teach-yourself-r-in-24-hours-book)中下载。我们在本书中一直强调要养成良好的编程习惯,结合我们用R开发产品的经验,将给读者提供一些实用的编程技巧。

学完本书,相信读者能很好地掌握R语言的基础。不仅能熟练使用许多最常用的包,还能亲手写出高质量的R代码。

本书旨在介绍开始学习R语言应该掌握的所有基础知识,然后针对具体的任务详细介绍R语言的其他要素。

每章的主要内容如下。

第1章,R语言社区。本章介绍R如何从S语言的演变成为现在的多用途数据科学编程语言。R社区为用户提供大量的帮助和支持,本章会介绍其中一些比较知名的内容。

第2章,R语言环境。本章用RStudio开始一个新的R会话,键入一些基本的命令,探索R“对象”的思想;概述R包的概念以及如何查找、安装和载入包。

第3章,单模式数据结构。本章介绍R中的标准数据类型,详细讲解3种关键的结构,分别存储3种数据类型(向量、矩阵、数组)。我们将举例说明如何创建和管理这些结构,重点讲解如何提取结构中的数据。

第4章,多模式数据结构。大部分数据源中都包含多种数据类型,我们要以简单高效的格式将其存储在一起。本章重点介绍两种关键的数据结构,用于存储“多模式”的数据:列表和数据框。我们用大量示例说明如何创建和管理这些数据结构,特别是如何提取其中的数据。除此之外,还将介绍如何在日常生活中有效地使用这两种数据结构。

第5章,日期、时间和因子。本章将学习R语言中一些特别的数据类型,有助于我们处理日期、时间和分类数据。

第6章,常用R函数。本章将介绍一些平时最常用的R函数。

第7章,编写函数:第一部分。R的一个优势是,可以通过自定义函数来扩展它。R允许用户创建自己的函数,执行各种不同的任务。本章先介绍如何创建自己的函数,指定输入和返回结果给用户,然后讨论R中的“if/else”结构,并使用该结构控制函数中的代码流。

第8章,编写函数:第二部分。本章将介绍一系列高级的函数编写技巧,如返回错误消息、检查输入是否与函数的参数类型匹配,以及使用函数“省略号”。

第9章,循环和汇总。本章将介绍如何以一种更简单的方式应用函数和代码。不用写冗长重复的代码,也能遍历指定的一部分数据重复地执行任务。

第10章,导入和导出。本章将介绍导入和导出数据的常用方法、R如何读写平面文件,以及如何连接数据库管理系统(DBMS)和Microsoft Excel。

第11章,数据操控和转换。数据科学家和数据统计学家都很少控制待处理数据的结构和格式。但是,了解如何控制它们能帮助我们更好地管理和理解数据。随着R的演变,其操作数据的途径也发生了很大变化。本章将进一步探索数据的结构,从“传统的”方法开始,讲解排序、设置、融合等数据操控任务,然后,介绍如何用备受欢迎的reshape、reshape2和tidyr包进行数据重组。

第12章,高效数据处理。本章介绍非常受欢迎的dplyr包。data.table包是一个专门针对大型数据的高效处理大型数据的独立包。

第13章,图形。熟悉了如何在R中操控数据,就可以开始学习如何把数据可视化了。本章将介绍如何用基本图形工具创建图形、如何将图形发送到图形设备中(如PDF和标准图形函数),以及如何控制页面上的图形布局。

第14章,ggplot2图形包。本章将介绍特别受欢迎的ggplot2包,由Hadley Wickham为创建高质量的图形而开发。

第15章,lattice图形。本章将介绍第3种创建图形的途径:使用lattice包。这个图形系统很适合绘制高度分组的数据,其代码与R用于建模的代码非常相似。

第16章,R模型和面向对象。本章讲解如何拟合简单的线性模型,如何用一系列文本和图形方法来评估拟合的性能。除此之外,还简要介绍了“面向对象”,以及如何用R统计建模框架构建面向对象的概念。

第17章,常见R模型。本章将扩展前几章的思想到其他建模方法。特别是,广义线性模型、非线性模型、时序模型和生存模型。

第18章,代码提速。本章将介绍一些用于提高编程效率的重要技巧,遵循这些技巧和好习惯才能写出高质量、专业化的R代码。

第19章,构建包。把代码放入包中,就必须确保编写的代码具有高标准,而且要附上示例并创建文档。本章介绍的重点是,要确保代码的质量和创建文档,是共享和重用高质量、专业化代码的前提。

第20章,构建高级包。有很多方式把包扩展为更加稳健,更容易让用户上手。读者将在本章学到最常见的包额外组件。

第21章,编写R类。本章在详细介绍R的S3实现之前,将概述面向对象编程的关键特性。

第22章,正式的类系统。本章将介绍R中更正式的S4系统和引用类系统。而且,还会讲到有效性检查、多重分派、面向对象消息传递、可变对象等概念。

第23章,动态报告。学到本章,大家已经对R语言的基本概念非常熟悉了,也明白了如何写出高质量、易于共享的代码,以及如何给代码创建良好的文档。有些报告特别依赖R生成的输出,本章将扩展R的用法,特别是简化生成这类报告的步骤。

第24章,用Shiny创建网络应用程序。虽然你可能根本没想过创建网络应用程序,但是本章将介绍一个包,让你直接在R中编写R代码生成网络应用程序。这是R当前最流行的包之一,越来越多的在CRAN发布的包都使用这个框架。

为了让读者更好地理解R的基本概念,本书包含了大量的代码示例。你可能注意到有些代码前面有一个“>”和“+”。这两个符号分别是R的命令提示符和延续字符,在编写代码时不用输入这两个符号。我们使用了格式化约定的函数名和包名。

本书包含的所有代码示例均可在我们的网站上下载:

http://www.mango-solutions.com/wp/teach-yourself-r-in-24-hours-book


注意

本书的代码示例中,偶尔会看到代码行以➥符号开头,这是代码延续箭头,表明这行代码太长,在打印页面上显示为两行。另外,有些代码示例中有行号,有些没有。有行号的代码示例是为了方便后面逐行讲解代码,而没有行号的代码在后面做概括讲解,不会逐行讲解。


本书从成稿到出版,离不开许多人的帮助和指导。首先,感谢Andy Miskell、Jeff Stagg、Mike K. Smith和Susan Duke,他们花了很长时间检查我们的初稿。感谢Mango公司的咨询团队和TIBCO的Stephen Kaluzny,耐心解答了我们在写作过程中提出的许多问题。

感谢在编辑、印制和发行本书过程中涉及的每一个人。特别感谢Elaine Wiley(制作编辑)、Trina MacDonald(策划编辑)、Songlin Qiu(开发编辑)、Olivia Basegio(出版人助理)、Stephanie Locke(技术编辑)、Bart Reed(文字编辑)和Katie Matejka(校对员)。


本章要点:

本章介绍R语言是如何从S语言演变而来的,以及它是如何成为当今一门万能的数据科学编程语言。在学习任何一门编程语言之前,先了解这门语言的一些起源和功能,大有裨益。对于R语言,它的许多功能和特性都来源于S语言,尤为如此。

作为一门免费且开源的编程语言,R语言离不开社区的贡献。R语言社区为用户提供大量的帮助和技术支持。我们将在本章中介绍R社区中一些重要且常用的分项,并在本章末尾进一步介绍R语言各版本的开发和发布情况。

以前,每次我给学生们上第一堂R语言课时,都会在课堂上提问有多少人有S语言的编程经验。对于R语言培训班而言,这是一个重要的问题。这两门语言的语法相近,如果了解S语言,就没必要坐在这里听R语言的入门课程了。前些年,学生举手的数量明显减少,于是我换了个问题:“在座的有多少人听说过S语言?”时至今日,开始学R语言的人都极少知道S语言了。看来,有必要在进入主题之前先回顾一下历史,了解什么是S语言以及它的起源。

S语言最初由美国贝尔实验室的John Chambers于20世纪70年代中后期开发,比谷歌还早,那时候还没有能查询编程语言的搜索引擎。John Chambers 在1976年的最初设想,如今看来已经很过时了(见图1.1)。Chambers这个想法的本质是,开发一门能为较低级别的Fortran子程序提供一个无障碍接口的语言。为此,统计学家不得不通过加快编码来提高效率。现在,像R、SAS、Matlab和Python都采用类似的途径。但在当时而言,这个想法很有突破性。

图1.1 John Chambers的设想框架变成了S语言

S语言的“S”表示“统计”(Statistics)。选择这个名称的主要原因是,为了和其他语言的命名方式保持一致(更早时贝尔实验室还发明了C语言)。而且,为该门语言起名时,众多候选名中均以S字母开头。其中有一个候选名是SAS,这与其他软件名称重名了(SAS是统计分析软件,Statistical Analysis Software)。

S语言的发展和演变经历了几个关键的转折点,最终发展成为S语言和现在的R语言。这是一个逐渐向C靠拢的转变过程,比如内部例程、从宏到函数的转换,以及在引入“S3”类系统后又引入了“S4”类系统等(详见第21章和第22章)。

由Statistical Sciences有限公司开发,并于1988年发布的S-PLUS的第一个版本,是在S语言发展历程中一个极其重要的里程碑。在接下来的几年里,Statistical Sciences公司创建了一个新的S语言图形用户界面,并用自己的Axum产品集成GUI,添加了交互式图形功能。除此之外,还为若干微软产品(如Excel和PowerPoint)添加了连接器。不过,最重要的是,Statistical Sciences公司获得了市场的独占许可证,发布了S语言,关闭了S语言的外包开发。后来,TIBCO软件公司在2008年收购了S-PLUS和Insightful。不过到目前为止,TIBCO在收购了S-PLUS之后就再没有发布任何新版本,他们把注意力放到了R语言上,并于2015年成为了R语言联盟的创始成员。

S语言和R语言具有相似的语法。主要的R语言项目网站(www.r-project.org )毫不掩饰与S语言的关系,把R语言描述为“与S语言和环境类似”,并声称“绝大部分用S语言编写的代码无需更改便可在R中运行”。这并不是说R语言是S语言的翻版或重复实现,而是为了强调R语言从S语言演变而来。几乎相同的语法也并非巧合,R语言的第一个版本由奥克兰大学的Robert Gentleman和Ross Ihaka在20世纪90年代中后期开发。在字母表中,R排在S的前面,既然源于S语言,怎么会命名为R语言呢?其实,之所以叫“R”语言,是因为Robert和Ross的名字都以R开头。这个理由相当充分。

Robert和Ross很快便被“R开发核心团队”的核心贡献群招入麾下,该组织现在负责R语言最新版本的开发和发布。在发布R-1.5.0后,核心成员们创建了“R语言基金会”,负责R语言的版权和归档等其他事宜。现在,R语言基金会中有许多S语言的原始开发团队,包括John Chambers。

R语言本身经历了许多迭代。每隔3个月,R就会发布一个维护性的小版本更新。尽管如此,许多功能(特别是核心统计例程)都与以前的S语言类似。

在开始安装R语言进行编程之前,我们想先强调一些R的可用在线资源。网络上有许多在线资源,几乎所有的可用资源都可以通过主要的R项目网站获得(见图1.2)。从该网站中,可以下载最新的R语言版本、下载R语言包、查找相关帮助、加入一些R语言邮件列表、查找R语言书籍等。

图1.2 R项目网站(www.r-project.org)的主界面

与商业支持软件(如SAS和SPSS)的区别在于,开源的R语言有大型、活跃的在线社区,为R提供各方面的支持。和许多其他开源社区一样,需要一段时间才能熟悉R语言社区。这是一个非常棒的社区!社区中有一个叫做R语言基金会的特别团体,成立于2015年。该基金会的目标是,为了让R语言对于新手而言更容易上手而不懈努力。

R项目网站上列出了专门探讨R语言的多个邮件列表。绝大多数R语言新手访问的第一站就是R-help邮件列表。我对所有新手的建议是,在R项目网站上向社区发布任何求助之前,先在网站上搜索一下归档内容(并阅读发帖指南)。你提问之前很可能已经有其他人讨论过相关的问题了。如果使用R-help会发现,其他人帮你解决问题的速度很快。无论白天黑夜,社区的大门都为你敞开。还有一点需要注意的是,如果对某个函数的行为或文档质量有看法,在发表评论时请注意自己的措辞,避免发生不愉快的言语冲突。要知道,作者在阅读评论时可没有销售或营销团队随时提醒他——你没有恶意。

以前在R-help中提问,一个典型的回复是:请阅读《R语言手册》。《R语言手册》(R Manuals)就像语言本身一样,许多方面都来源于S语言。如果有什么和R相关的问题,总能在一系列R语言手册中找到答案。特别是《编写R语言扩展》(Writing R Extensions)手册,致力于研发R包的人一定不能错过这份重量级的参考手册。不过,除非你非常熟悉一些泛型编程概念(如,面向对象),并为此做足了功课,否则很难读下去。当然,R语言核心团队也意识到了这个问题。他们在《R语言入门》(An Introduction to R)手册前言部分的“给读者的建议”(Suggestions to the reader)中,建议R语言的新手最好能跳过该手册的前80页,直接从附录A的简单会话开始阅读。

虽然在网站上可以获得大量在线资源,但是对R语言的新手而言,要找到自己所需的内容并不容易。即使像我这种使用R语言快15年的人,如今在谷歌中键入R和空格时,搜索框下面出现的备选项依旧是R. Kelly!不过,一般而言,只要能区分R&B[1]和统计编程的话,用谷歌搜索R相关的资料也相当简单。除了谷歌,还可以在其他地方搜索R的相关材料,很多资料就直接列在R项目的网站上。值得一提的是,斯坦福大学的Sasha Goodman创建的Rseek能搜索到一些R语言的相关网站。

如果喜欢用R语言手册来查询,可以使用DataCamp开发的一个工具:R Documentation。R Documentation是一个网站,把主要的R语言资源集结在一起。该网站还能搜索CRAN(Comprehensive R Archive Network)的Task View中的包。我们将在第2章详述CRAN和R包。

2015年6月30日,Linux基金会发起了R语言联盟。R语言联盟主要由工业界和学术界的数据科学家组成,他们的共同目标是推进R语言和支持R语言社区的发展。R语言联盟的首页如图1.3所示。R基金会的现有成员包括:创始成员微软和RStudio(铂金);TIBCO软件有限公司(黄金);Alteryx、谷歌、惠普、Mango Solutions、Ketchum Trading、甲骨文(白银)。

图1.3 R语言联盟(www.r-consortium.org)的主页

R语言联盟目前处于起步阶段,它将致力于改善R语言的易用性,而且对R语言的下一阶段发展起到监管作用。R语言联盟的主页将很快替代R项目的主页,作为进入R社区的大门。

开源社区的另一个好处是,可以参与全球范围的用户活动。新的用户群层出不穷,参与活动的用户群数量从5增至5000。通常,参与者大都利用自己的业余时间来参加活动,所以活动一般都在晚上举行。在R语言发展初期,这些用户会议就是R语言爱好者进行交流和分享的主要平台。后来,许多会议日趋成熟,获得了商业支持。

除了本地的R语言会议,主要的“useR!”讨论会从2004年开始定期举办,参与者的数量每年都稳定增长。该讨论会通常关注R语言和R包的开发,基本上都是学术界和工业界的演讲,如今还获得了R语言联盟的支持。2014年,UserR!加入了EARL(Effective Applications of the R Language)讨论会。EARL主要致力于R语言的商业用途,涉及众多工业部门,其目标是共享R语言的知识和应用。

除跨领域的R讨论会以外,还有针对金融或保险行业的专门工业R讨论会,分别是R/Finance和R in Insurance。其中,R/Finance讨论会从2009年开始,每年在芝加哥举办;R in Insurance讨论会从2013年开始每年举办一次。

虽然R语言作为一个开源的GNU项目,任何人都可以免费下载源代码,但这并不代表任何人都可以随意修改源代码。R语言核心开发团队现在仍控制着R源代码的写访问。当然,R语言的流行也离不开核心团队以外的众多贡献者。他们编写了成千上万的R包,都可以从CRAN资源库中免费下载。CRAN是一个FTP网络,网络服务器镜像遍布全球,每个镜像都包含R语言的各个版本和贡献的R包。

R包的领域跨度很大,质量也参差不齐,R用户现在都少不了要查找和使用新的R包。许多资深的统计学家或数据科学家,经常对应不同的R版本在他/她们的本地机器中安装几百个包。我们将在第2章中详述R包。

R语言核心开发团队负责确定发布R语言新版本的具体时间。每次发布都将根据之前的版本对新增特性和修正进行描述。R语言的各个版本遵循“主—次—补丁”的命名结构(例如,R-3.2.0)。R的第1个版本是R-1.0.0,于2000年2月份发布。从那以后,稳定发布补丁版本和次版本,偶尔发布主版本。近些年来,R语言的发布速度稍缓,大约每年发布一次R语言的次版本。根据以往的惯例,每次发布次版本后都会有2~3个相关的补丁版本发布。


注意:别名

R语言核心开发团队第一次给R语言的发布版本取“别名”是在2.15.1版本,名为“烤棉花糖”。随后每个R版本都有一个有趣又好记的随机别名。版本的别名在启动时显示。另外,运行R.Version()$nickname也可以显示。

用过SAS或Microsoft Excel的朋友一定很想知道,R语言的版本为什么发布如此频繁。一般认为,高频率发布意味着不稳定,这似乎说明R语言的bug很多。实际上情况恰恰相反。不过,商业组织对于采用的R版本和更换R版本的频率都持谨慎态度。通常,公司会等到次版本的第2或第3个补丁版本(如R-3.1.2)发布以后才升级所用的R环境。

如果你确定发现了R中的一个bug,可以直接给包维护团队发邮件,非常简单。和大部分商业支持的闭源模式不同,开源模式下用户可以和开发R语言代码的人直接对话。一旦确定有真正的bug,你就可以和维护人员一起解决问题,有时包作者也会对你所付出的努力给予肯定。一旦找到了问题的解决方案,通常会在下一个发布的补丁版本或次版本中修复bug。这意味着在一般情况下,bug很快就会被修复,你不用为此等上好几个月。

本章简要介绍了S语言和R语言的演变历史。读者平时看到的“S3”“S4”也源于S语言,我们将在第21章和第22章中详述相关内容。

本章还介绍了R语言社区和支持R语言的不同群体:R语言核心开发团队,R语言基金会和R语言联盟。然后,介绍了一系列可用的在线资源,提到了查找R语言帮助时会遇到的一些困难。最后,讨论了R语言的开发周期,以及修复代码中bug的一些情况。

在本章末尾的“补充练习”中,要求大家安装R和RStudio集成开发环境(IDE)。在下一章中,我们将在RStudio IDE中开始使用和学习R语言。

问:R语言的版本这么多,向下兼容有没有问题?

答:如果考虑R语言的基础包,忽略那些可以从CRAN中下载的众多额外包,公正地说,R语言向下兼容很好。实际上,现在R语言的很多特性都依赖于当时S语言的开发。当然,R语言能发展成现在这样,离不开CRAN资源库中成千上万资源包作者的共同努力。即使是一些知名的R包作者也免不了一次又一次地改变想法,而且包的版本号也有了很大变化,但是R能有现在的成就,他们功不可没。如今,保证R语言包的质量和一致性是R语言基金会所面临的最大挑战。

问:同事留发我一大堆S语言的代码,能在R中运行它们吗?

答:官方的说法是“两种语言存在一些重大差异,但是,大多数S代码无需更改就能在R中运行”。对于绝大部分的日常代码,的确如此。当然也有一些例外。比如,计算标准差的函数在S语言中是stdev(),而在R语言中是sd()。对于稍高级的用户,一些功能的作用范围会成问题(这就是官方说法中“重大差异”的地方)。不过,本质上官方的说法完全正确。用肉眼观察的话,S代码和R代码看上去的确非常相似。

课后研习包含“随堂测验”和“答案”两部分,旨在帮助读者巩固本章所学知识。请读者先尝试回答“随堂测验”中的所有问题,再看后面的“答案”。

随堂测验:

1.与R语言“类似”的编程语言是什么?

2.CRAN这个英文缩写是什么意思?

3.下面的R语言团体中,哪一个控制着R源代码的写访问,并负责发布R语言?

  A.R语言核心开发团队

  B.R语言基金会

  C.R语言联盟

答案:

1.S语言。

2.综合R档案网络(Comprehensive R Archive Network)。

3.这些由R语言核心开发团队直接负责。R语言基金会或R语言联盟负责每次版本发布的资金和相关支持。

1.参考本书附录A中的“A.1 安装R”,下载与所用机器匹配的R语言版本,并安装到自己的操作系统中。

2.参考本书附录A中的“A.3 安装RStudio IDE”,从RStudio网站下载最新版本并安装。

[1] 节奏布鲁斯(Rhythm and Blues,简称R&B),是一种音乐形式。R. Kelly是一位非常著名的R&B艺人。——译者注


本章要点:

本章默认读者已经在学习第1章时安装了R语言和流行的RStudio Desktop IDE。本章先通过RStudio创建一个新的R会话,输入一些基本的命令,探索R语言中“对象”的思想;然后更正式地介绍R包的概念。在本章最后的“补充练习”中,要求读者从CRAN资源库中下载R包,这些R包中含有本书所需的数据集。

在第1章中,要求读者安装了两款软件:R语言和RStudio Desktop。本章,我们重点介绍如何使用RStudio。当然,也不是非要安装RStudio才能使用R语言。别忘了在安装R语言时同时安装的R GUI。其实很长时间以来,大多数用户都是通过R GUI和R语言进行交互的。不过,RStudio真的很好用,为用户提供了很多便利和帮助。

随R语言一同安装的R GUI为用户提供了一个操作环境,用户可以通过R语言控制台与R进行交互。R GUI中有一些下拉菜单,能快速安装和下载R包,加载工作空间和访问R手册。除此之外,还有一系列快速访问按钮,包括执行脚本的“运行R脚本文件”按钮和允许用户取消已提交语句的“中断当前计算”按钮。

与“时髦”的IDE相比(如RStudio),R GUI似乎相当过时。不过,如果打开R只为了运行一两个命令的话,它的加载速度非常快。从本章开始,本书使用功能强大的RStudio IDE来学习R。尽管如此,本章中讨论的诸多特性都可以直接通过R GUI实现,只不过这些特性在R GUI中的名称或行为会稍有不同。

RStudio是一家美国公司,致力于为R用户开发好用的软件工具。其中,RStudio就是一个极受欢迎的R集成开发环境(如图2.1所示)。2011年,RStudio环境的第一个版本问世,有桌面和服务器两种模式供下载。其中服务器版本可通过浏览器访问。从那以后,RStudio的开发进度稳定,其IDE超过了许多其他环境,一跃成为最受欢迎的R语言集成开发环境。

图2.1 RStudio环境

现在,RStudio仍然是开源的,可获得桌面和服务器产品。两种产品的商业版本中添加了一些额外的特性,如安全性和商业支持。

要根据自己的操作系统,安装与之匹配的最新版本RStudio Desktop。RStudio由4个主要的面板和窗格组成。单击并拖曳两个窗格之间的区域,很容易上下或左右调整各窗格的大小。但是,要通过菜单选项才能改变窗格的布局:选择Tools(工具)> Global Options(全局选项),然后,单击左边栏中的Panes Layout(窗格布局)按钮。RStudio中的结构化窗格布局是RStudio区别于标准R GUI的特性之一。新用户通常意识不到,这些窗格(如,Packages 和 Environment)提供了R核心功能的用户界面。总的来说,RStudio环境帮助了许多新用户以轻松愉快的心情使用R,这些用户很可能是因为之前受不了R GUI的界面才放弃的。

本章将讲述RStudio中最相关和最有用的特性。RStudio产品在不断地改进,随时都会添加新的特性。它的所有文档均可在RStudio产品网站下载,也可通过RStudio中的Help(帮助)菜单访问。

R GUI和RStudio不是唯一两种与R交互的界面。除此之外,大家对Notepad++一定不陌生,这是非常流行的通用文本编辑器,它也能理解R语法。你甚至可以用从SourceForge下载的NppToR插件,通过该编辑器提交代码。与此类似,ESS是一个用于加强Emacs文本编辑器功能的扩展包,使其能与R交互。高度定制的Vim编辑器也有一个R插件。

Eclipse是一个非常流行的开发平台,由Eclipse基金会负责维护。该基金会为许多编程语言提供支持。StatET插件能让用户创建定制的R环境。带有StatET插件的Eclipse在处理大型的多语言项目时特别好用。不过,休闲用户会觉得与R GUI相比,这家伙有点臃肿了。另外,还有Rattle(这是一款开源GUI,用于R中的数据挖掘)和Tinn-R(一款用于Windows的R GUI和开发环境)。

由于篇幅有限,无法列出所有的开发环境。这里只是想告诉大家,可以从许多不同的应用软件和环境中调用R。比如,从Excell中用RExcell调用R。与此类似,许多大型商业智能供应商都提供自己的脚本编辑器,允许用户在R中编写扩展。其中,甲骨文、惠普和天睿资讯都能在其数据库中运行R。2015年5月微软宣布,将在SQL Server 2016中提供相同的功能。

R语言的基本语法有点类似于其他数学/统计学的脚本语言,如Matlab和Python。本节,我们来了解一下R控制台,输入一些简单的命令,看看交互式R会话是如何运作的。

R GUI和RStudio通过R控制台访问R会话。这种控制台本质上相当于运行一个命令行的R会话。在R控制台中直接输入一行R命令,按下Enter键后,命令的结果便显示在下一行。

启动R会话,便会出现一些欢迎使用的初始启动消息。消息中给出了正在使用的R版本信息和一系列R核心开发团队希望用户了解的命令,如图2.2所示。在启动消息下面的是>符号,通常被称为命令提示符。

图2.2 R控制台


警告:无担保!

注意初始启动消息中的“ABSOLUTELY NO WARRANTY”(完全无担保)注释。如果出什么问题,不要想着打电话找负责人抱怨!

命令提示符右侧闪烁的光标,表示R已经准备好随时为用户提交待处理的新命令。下面演示一则在R控制台中进行的简单数学运算:

> 4*5    # 一条简单的命令
[1] 20
>

这里我们请求R,对表达式4*5求值。正确的答案是20,显示在命令的下一行,光标出现在运算结果下一行的命令提示符后面。[1]指的是R打印向量的方式,第3章将详细介绍相关内容。注意上面代码中的#符号,其后是我们给代码写的注释。R将忽略第1个#号后面一整行的所有内容。


警告:注释块

R不接受多行注释。如果注释要占多行,那么每行注释都要以#开始,形成一个注释块。

R处理完整行代码后,命令提示符会再次出现。如果提供的一行代码不完整,下一行将出现一个“延续”提示符+,如下所示:

> 4*    # 不完整的一行
+

这种情况经常出现在漏写右括号或右引号的时候。当然,我们有时出于其他原因会故意利用这一特性把代码分成多行。R是以语义完整的“一行”代码来处理语句的,而不是以显示的一行代码为单位来处理,所以,不完整的多行代码不一定导致语法错误。如果这是故意为之,或者如果我们知道如何把代码补充完整,直接补全代码并按下Enter键即可。如果犯了比较严重的错误或者不确定是什么错误,按下Esc键即可取消当前语句并回到标准命令提示符。

使用R控制台

请按下面的步骤在R控制台中输入一些命令。

(1)打开RStudio,等待出现命令提示符。

(2)输入一则待求值的数学表达式,如20/4。

(3)按下Enter键。

正确的结果将显示在[1]之后,光标将出现在命令提示符>后面。

专业级代码很少直接在控制台或命令行开发。可读性好、文档完整和结构清晰的大型代码应该在R脚本中开发。RStudio环境提供一个增强的文本编辑器(见图2.3),可用于开发R脚本。RStudio把这个文本编辑器称为Source(源代码)窗格。在RStudio中,通过File(文档)> New File(新文档)> R Scripts(R脚本)或者相应的按钮和快捷键,便可打开脚本窗口。

图2.3 脚本编辑器和控制台窗口

在脚本开发期间,单击Source窗格顶部的Run按钮,控制台便开始执行Source窗格中的代码。这相当于Windows中的Ctrl+Enter快捷键或OS X中的Command+Return快捷键。在默认情况下,提交的代码将被逐行执行。RStudio将提交光标所在位置的完整代码行,而不是光标所在的那一行。这里需要强调的是,如果只运行完整代码行中的一部分或多行代码,要明确选择待提交给控制台执行的代码。

本书的示例大都很简单,可以直接用R控制台运行。尽管如此,我们还是建议读者在学习过程中把自己编写的所有代码都储存为一系列脚本。单击File(文档)> Save As(另存为),或者直接单击Source窗格顶部的Save快速访问按钮,即可把当前脚本编辑器的内容储存为文档。我们将在第7章中开始学习如何编写函数,到时就要用到脚本。

R语言经常被描述成一门松散的面向对象编程语言。如果你有计算机科学领域的教育背景,就一定用过真正的面向对象语言(如Java),也许觉得R算不上是面向对象语言。如果你和本书作者一样,有分析学教育背景的话,会对R手册中多处提到的“对象”摸不着头脑。

刚一开始不理解什么是对象,很正常。本书将在第16章、第21章和第22章中详细介绍R语言中的面向对象。现在大家只需要理解,任何东西都有一个名称,而且可被分为不同类型的“对象”。例如,有“函数”对象、“数据”对象和“统计模型”对象。本书首先重点讨论“数据”对象,然后着重讲解具体“函数”对象的用法。

R“包”中储存了成套的R“对象”。所谓的包是指储存数据、函数和其他信息的结构化元素。在安装R时就默认配备了一组核心包,可以在安装R的“library”子目录中查看。实际上在启动R会话时,只会加载一小部分已安装包的子集。这是为了减少R的启动时间,避免屏蔽行为(详见第2.4节)。

开始一个R会话,一组“默认”包便被自动加载进当前的环境中,以便用户能立即访问绝大多数常用的R函数和其他对象。加载进环境中的包列表叫做R的“搜索路径”,用search()函数可以查看该搜索路径。已加载包的物理位置可以用searchpaths()函数查看。代码清单2.1中演示了这些函数。

代码清单2.1 搜索路径

 1: > search()
 2:  [1] ".GlobalEnv"        "tools:rstudio"      "package:stats" 
 3:  [4] "package:graphics"  "package:grDevices"  "package:utils" 
 4:  [7] "package:datasets"  "package:methods"    "Autoloads" 
 5: [10] "package:base"    
 6:  > searchpaths()
 7:  [1] ".GlobalEnv"
 8:  [2] "tools:rstudio"
 9:  [3] "C:/Program Files/R/R-3.1.2/library/stats"
10:  [4] "C:/Program Files/R/R-3.1.2/library/graphics"
11:  [5] "C:/Program Files/R/R-3.1.2/library/grDevices"
12:  [6] "C:/Program Files/R/R-3.1.2/library/utils"
13:  [7] "C:/Program Files/R/R-3.1.2/library/datasets"
14:  [8] "C:/Program Files/R/R-3.1.2/library/methods"
15:  [9] "Autoloads"
16: [10] "C:/PROGRA~1/R/R-31~1.2/library/base"


注意:文本包装

如代码清单2.1所示,调用了search()函数后,以每行3个元素打印输出,而searchpaths()函数的输出稍长,一行只打印1个元素。方括号中的数字表示该元素在搜索路径中的位置。


注意:RStudio工具

"tools:rstudio"是RStudio的特有项,它包含RStudio IDE要用的许多隐藏对象。普通的R用户不会用到这里面的对象。

每个加载的包都包含了许多可访问的R对象。R有许多函数都可用于列出包中这些对象,其中一个常用的函数是objects(),该函数可以列出包含在指定包中的对象。如果要列出某包中的对象,只需调用该函数,并指定该包在搜索路径中的位置即可。如果不知道包的具体搜索路径,可以使用"包:[包名]"语法。具体做法是:先运行search()函数,查看输出的结果,然后在objects()函数中指定其中的一个元素即可。例如,想查看graphics包中所包含的对象名,用下面两种方法都没问题:

objects(4)                     # 假设graphics包在搜索路径中的位置是第4
objects("package:graphics")    # 假设不知道具体的搜索路径

ls.str()函数提供包中每个对象的简要信息清单(如果对象是函数的话,通常会列出该函数的参数)。调用ls.str()函数的方式和objects()函数相同,即指定包在搜索路径中的位置或者search()函数输出的文本。


注意:查找隐藏对象

用这种方法列出包中的对象时,所列的是包开发者选好可以给用户查看的对象。

如果要查看一个包中的所有对象,可以在objects()函数中使用all.name参数,设定all.names = TRUE

搜索路径中并不是每一项都是R包。特别是用search()searchpaths()返回的第1个项:".GlobalEnv"。该项指的是所谓的“全局环境”(或“工作空间”)。这是一个储存盒,里面储存着用户在R会话期间创建的所有对象,可能是用户读入R的数据或者自己编写的函数。一开始,工作空间里是空的,用户可以随意创建自己的对象。给一个对象赋名的标准做法是使用<和-字符组成的一个箭头(<-)。箭头左侧是待创建新对象的名称,右侧是给对象储存的指定值。如下所示:

> x <- 3*4
> x
[1] 12


注意:动态输入

R是“动态类型”的编程语言。这意味着给一个对象赋值之前不用先指定类型(或类)。与静态类型语言相比(如Java 和 C),虽然动态类型语言写入速度更快,但是运行速度较慢。

除了用向左的箭头表示赋值外,还可以用=号。一些人认为向左的箭头能更清晰地表达新对象被创建,而另一些人则认为=号所表达的赋值概念与其他编程语言更为一致。大多数情况下,这两种用法的区别很小,但是资深的R包开发人员更倾向于使用向左箭头。鉴于此,本书的示例中也使用向左箭头来表示这一概念。


注意:向右赋值

赋值箭头两个方向都起作用。例如,可以创建一个变量x,输入9-> x也可以为其赋值9。但实际上,很少有人用向右箭头来赋值。通常建议不要这样用。

1.命名对象

在R语言中,对象名可以是任何字母、数字、.、_字符的组合,而且R对于对象名的长度没有要求。唯一的限制是不能以数字或“_”开头。以点(.)开始的对象是可访问的隐藏对象。这里要注意,R语言区分大小写。因此,myObjectmyobject是完全不同的两个对象名。


注意:用引号命名对象

严格来说,对象名以数字或下划线开始是可以的,甚至以空格开始也可以。但是,通常禁止以这种形式命名。必须使用3种引号的其中一种来识别非标准对象名:单引号(')、双引号(")或反引号(`)。如果以这种方式命名对象,R语言的标准做法是使用反引号。

R语言对命名风格没有硬性规定,R用户也没有统一命名风格约定。本书主要采用“驼峰式大小写”,这也是在Mango Solutions公司的编码标准中被采用得最多的一种命名约定。驼峰式大小写风格规定,对象名中除第1个单词以外,每个单词的首字母都要大写。谷歌的R编程风格指南《Google’s R Style Guide》对该约定的变体进行了讨论,给有需要的人提供建议和帮助,有助于规范专业级R代码的书写风格。


提示:移除对象

rm()函数可用于移除工作空间中的对象,如rm(x)

objects()ls()函数的默认作用范围是搜索路径中的第1项(即全局环境)。因此,rm(list=object())rm(list=ls())可以删除全局环境中的每一个对象。

2.工作目录

在R语言中,工作目录是导入文件和写入信息的默认路径。理解如何询问和更改工作目录有助于更好地与他人协作、共享代码。如果代码的结构良好,且始终都使用相对文件路径(与绝对文件路径相对)的话,就只需在启动R会话时设置一次工作目录即可。


提示:导航文件系统

R函数list.files()可用于列出特定目录中的所有文件和文件夹,返回文件/目录或者完整的文件路径。

可以用getwd()函数查看当前工作目录,用setwd()函数更改工作目录。在RStudio中,通过Session(会话)> Set Working Directory(设置工作目录)菜单项更新工作目录。另外,也可通过Files(文件)窗格来设置。

注意,代码清单2.2中用正斜杠(/)指定目录路径。R每次读到反斜杠(\),就会跳到下一个字符并尝试解析“转义序列”。因此,从Windows浏览器复制目录路径是件苦差事。简单的做法是,把每一个反斜杠替换成正斜杠或双反斜杠(\\),包括服务器的路径。例如,Windows的路径\\server ,在R中要变成\\\\server//server

代码清单2.2 工作目录

 1: > # 打印当前工作目录
 2: > getwd()
 3: [1] "C:/Users/username/Desktop/STY"
 4: > # 用绝对路径更改当前工作目录
 5: > setwd("C:/Users/username/Desktop")
 6: > getwd()
 7: [1] "C:/Users/username/Desktop"
 8: > # 用相关路径更改当前工作目录
 9: > setwd("STY")
10: > getwd()
11: [1] "C:/Users/username/Desktop/STY"

反斜杠本身也被称为转义字符。转义字符在编程中有特殊的地位,它改变了随后字符的行为(假设转义序列已知)。双反斜杠(\\)是R语言中转义序列的一个用法。在后续章节中,我们将讲解诸如\n\t这样的转义序列。

3.保存工作空间中的对象

在R会话期间,用户在全局环境中创建的对象都储存在内存中。关闭R时,必须选择是把这些对象储存到磁盘中以备后续使用,还是删除它们。

当用户决定退出RStudio时(并因此关闭他们的R会话),会出现一个与图2.4类似的对话框,询问用户是否要“把工作空间映像保存至~/.RData中”。下面有3个选项:Save(是)、Don’t Save(否)、Cancel(取消)。如果选择“Save”,RStudio会在当前工作目录中创建一个.RData文件。这是一个压缩格式,R利用它就能在全局环境中重新生成已保存的对象。RStudio会自动保存一个.Rhistory文件,该文件中包含R会话期间输入的所有命令的列表。在RStudio的History窗格中可以看到该文件。

图2.4 保存或不保存


提示:保存大型对象

在R会话期间,可以随时使用save()函数。例如,它可用于创建自定义的.RData文件,其中包含用户直接指定的对象。在处理大型数据集时,save()函数和它的配对函数load()很好用。因为加载那些储存为.RData文件的对象比从CSV文件或其他格式的文件中读取数据要快一个数量级。

在专业环境中经常要处理多个项目,每个项目都有自己的目录结构。在RStudio中,可以通过IDE右上角的按键创建项目。在指定的目录中创建一个新项目时,RStudio会把一些信息储存在与当前项目相关的目录中。创建新项目会重新启动R会话,而且工作目录将被设置为新项目的目录。在关闭RStudio后重新回到项目时,会重新打开程序关闭之前打开的所有文件,让用户能接着之前的进度继续工作。这不是RStudio的特例,像Eclipse和StarET这样的工具还提供更丰富的项目启动,能根据打开的项目关联特定版本的R。

安装R时,配备了大约30个基础包(也叫做“核心包”或“推荐包”),实现了大量基础的功能。当然,R的成功也离不开成千上万附加包作者的贡献,他们以附加包的形式提交新的功能。

R包的主要资源都在CRAN上。截至2015年,CRAN上的R包数量已超过7000个。另外,还有一个面向R开发者的专业资源库:R-Forge。不过,越来越多的作者选择在更通用的GitHub上共享包的开发版本。除了这些基本的资源库之外,生物信息学领域还有自己的资源库:Bioconductor,提供分析和理解高通量基因数据的工具。Bioconductor社区非常强大,甚至定期举办该领域的BioC讨论会。

CRAN资源库发展得非常迅速。2011年我开始教授R语言课程时,CRAN上只有不到2000个包。到2015年,包的数量就已经超过了7000个。R核心开发团队一直在想办法限制包的数量,希望R基金会的建立能控制一下包数量暴涨的局面。现在还没有查找合适包的标准方法。我们先从了解CRAN的Task View(任务检视)开始,如图2.5所示。

图2.5 CRAN的Task View(任务检视)

在撰写本书时,CRAN的Task View中有33个分类项。每个分类项都由R社区的成员手动维护,这些成员对所负责的主题特别擅长或特别感兴趣。由于涵盖的领域众多,各分类项中的内容会有很多重叠的情况。这个不难理解,通常开发的包都可用于多个领域。反之,CRAN上并不是所有的包都出现在Task View中。

CRAN的开源无法避免重复劳动,两个独立的开发者很可能绞尽脑汁地解决了同一个问题。结果就是多个包都针对同一个问题而开发,只是解决的方法稍有不同。确保大家在某个项目上更好地合作是将来R基金会的主要目标之一。CRAN的Task View旨在告诉用户有哪些包可用,而不是以任何方式给包排名。可以说,通过CRAN查找合适的包是件极具挑战的事!

2012年,RStudio开始维护自己的CRAN镜像,并公布通过该镜像下载的所有包的下载日志。鉴于目前RStudio的受欢迎程度(默认从该镜像下载),从这份包下载日志中就能知道现在哪些包最流行。Gábor Csárdi的METACRAN(http://www.r-pkg.org/)汇总了RStudio的包下载日志,以更友好的交互方式总结了RStudio下载日志。本书将讨论许多流行的常用包。

RStudio中的Packages(包)窗格为用户提供了一个友好的界面来安装和下载R包。在安装R包时,实质是在用户的机器中创建一个目录。一旦包安装成功,只要不删除它,包就一直储存在用户的机器中。


提示:删除包

remove.packages()函数可以删除系统中的包。

用户安装第1个包时,会被询问是否要创建自己的本地库。所谓库,就是一个包含R包的集合名称。当你以标准用户的身份登入操作系统,没有管理员的所有权限又要在R中创建新文件时,本地库的作用就体现出来了。如果有本地库,RStudio中的Packages窗格会以“User Liberary”(用户库)和“System Library”(系统库)来分类显示包的安装位置。

在RStudio中安装R包最快的方式是单击Packages窗格的Install按钮,然后会弹出一个窗口,如图2.6所示。

图2.6 安装R包时弹出的窗口


提示:本地库

.libPaths()函数可用于询问R当前使用了哪些库。该函数还可用于指定R使用不同的本地库。虽然不能更改系统库,但是可以根据需要创建任意多的本地库。

如果在载入包时不指定包的位置,R将依次遍历所有的库来查找用户指定的包名。

1.从CRAN安装

要从CRAN安装包,必须确定图2.6中的“Install from”区域是指向CRAN。如果是在命令行操作或者使用R GUI,就要先选择CRAN镜像。RStudio帮用户完成了这一步,所以不必担心选择镜像的问题。如果当前机器连接着互联网且防火墙允许,就只需在Packages下面的框中输入要安装的包名,接下来RStudio将自动完成整个安装过程。值得注意的是,虽然RStudio默认安装至本地库,但是如果机器中有多个库,你可以指定安装到哪一个库中。


警告:包的质量

能放到CRAN上的包都通过了层层检查,所以我们自然认为CRAN就是包质量的保证。从某种程度上看,没错。但是,从CRAN下载的包并不全是经过测试的,或者并不都是在“有效”环境中开发的。只有“核心包”和“推荐包”才是经过R核心开发团队测试的。

为了不给日后添麻烦,我们建议勾选弹出窗口中的“Install Dependencies”(安装依赖包),除非你特别在意安装了什么到系统中。如果不安装依赖包,在载入包时会失败。一些流行包的依赖包通常不少于10个。如果不勾选这一项,以后就要一个一个手动安装,相信你不会自找麻烦。

注意到Install Packages工具在Console窗格中生成了一行代码,即调用R函数install.packages()。该函数包含于utils包中,启动R时已经默认载入。在任何会话中都可以调用这个函数。

2.从包存档文件(二进制)安装包

CRAN是R用户的主要包资源库,但不是唯一的资源库。许多商业组织会创建自己的实用包供内部使用,而不是在内联网中使用发布的二进制包。这里的“二进制”是指被收录在档案库里待安装的包(Windows中是“.zip”,OS X中是“.tgz”)。直接从CRAN安装包时,要根据机器的操作系统选择合适的二进制包。先把包下载到一个临时位置,然后“打开”并安装。手动安装二进制包,就跳过了CRAN部分,直接通过R解包。值得注意的是,构建二进制包的目的是为了用R来解包,你不用自己去解压缩安装包。

3.从源安装包

因为R是开源的,所以我们可以获得源代码,而且源代码可以作为“.tar.gz”文件发布。除了从二进制包安装外,还可以直接从包源安装。Linux的用户必须从源安装,Windows和OS X的用户则不必这样做,除非他们要创建自己的包。还有一些其他情况也能从包源安装,但是从源安装比从二进制安装费时,而且可能需要其他工具。例如,Windows用户要安装一个与当前R版本匹配的Rtools版本。Rtools的使用说明详见附录A。

为了用RStudio GUI从源安装包,Linux用户只需要按照上面介绍的安装包存档文件的指令进行即可。而Windows或OS X的用户,则先要把“tar.gz”文件下载到本地,然后像安装本地二进制包一样进行安装。如果无视操作系统,则可以直接从控制台安装,运行添加了参数type = "source"install.packages()函数。


提示:从GitHub安装

devtool包中的install_github()函数能帮助用户从GitHub的资源库中直接安装。当然,也可以使用install.packages()函数从其他资源库中直接安装包。

启动R时,实际上只有那些已安装的子集才会被载入R会话。这样能减少R的启动时间和避免屏蔽行为。为了使用其他已安装包的功能,必须将其载入环境中。RStudio的Packages窗格中列出了R会话可载入的所有包。只需勾选包名前面的小方框,就能载入这些已选中的包了。勾选小方框相当于生成一行调用library()函数的R代码。当然,也可以直接在R控制台中调用library()函数。

在开发可重复使用的产品级代码时,最好尽量避免使用随意的“单击”行为。标准的做法是,在R脚本顶部放置多个library()函数的调用,这样能方便其他用户运行你的代码。如果找不到指定的包库,library()函数只会抛出一条错误消息,不方便后续执行。另一种较好的做法是,用require()函数替换library()函数。如果待载入的包不存在,require()函数给出操作建议并抛出一条警告。可以利用该函数的返回信息进一步控制脚本的行为。比如,“do this, but only if package X has successfully been loaded”(只有X包成功载入后才这样做)。我们将在第7章和第8章详细讲解错误、警告和控制流。在专业开发环境中,检查包是否存在还不够,因为包的版本不同或者操作系统版本不同也会导致错误。我们在后面的章节中再详述相关的内容。

1.依赖包

在开发包的过程中,把所需的函数全都从头实现几乎是不可能的。通常都要使用其他包中定义好的一个或多个函数。这里的“使用”并不是把函数的代码全都复制到自己的包中,而是只需指定“依赖”其他包就行了。这样避免了代码重复,确保了只在一个地方修复bug。加载一个有依赖包的R包时,该包的依赖包也会载入和添加在搜索路径中。值得注意的是,这意味着必须把R包的依赖包也安装到机器中。

2.屏蔽

如果搜索路径上的多个“环境”中有多个同名对象,在搜索时就会发生屏蔽(mask)。无论何时用输入名称的方式来引用一个对象,R都会在搜索路径上已载入的环境中依次查找该对象,从全局环境开始。如果找到了一个对象,R就停止搜索。而其他与之同名的对象都被隐藏或“屏蔽”了。

可以删除自己工作空间中的对象,但是不能删除R包中的对象,我们只能屏蔽它们。如果不小心屏蔽了一个对象,可以用另一个不同的名称复制那个对象,然后用rm()函数删除工作空间中的原始对象即可,这样就为原来隐藏的对象解除了屏蔽。


提示:确保使用正确的对象

绝大多数R的新用户都觉得屏蔽的问题很棘手,其实远没有那么多屏蔽问题。这很大程度上归因于包名称空间,我们将在第19章和第20章中详细讨论相关内容。为了避免潜在的屏蔽问题,可以使用[包名]::[对象名]语法直接在包中引用一个对象,如 base::pi

help()函数可用于显示一个函数的帮助,或者更确切地说是,显示任何R对象的帮助。RStudio的用户可以通过Help选项卡导航R的帮助文件。如果查找的内容与当前会话中可的R对象完全匹配,该函数将返回该对象的帮助文件。否则,它将继续在你的包库(包括那些未载入的包)中搜索。


注意:通过控制台获取帮助

RStudio的Help窗格把utils包中的功能进行了包装。在控制台中,用help.search()函数或??可对待查对象进行帮助文件的模糊查找。类似地,如果知道待查的具体对象名,就可直接用help()函数或?查看帮助文件。

如果不熟悉标准术语,帮助文件看上去就有点吓人。图2.7是mean()函数的帮助文件截图,其中很多地方都用到了诸如“object”“vector”“mathods”等这样的术语。

图2.7 mean()函数的帮助页

包维护人员鼓励所有的包作者把帮助页面中的每一项都补充完整,但实际上有些会偷工减料。例如,要在CRAN上发布一个包,就必须通过“R CMD检查”。这要求该包帮助文档中Examples(示例)部分的所有示例都运行无误。而实际上,不包含示例部分就能通过检查!

本章讲解了如何获得R环境,重点介绍了RStudio环境。进一步了解了R语言的组成,如何通过大量的核心包和推荐包构建起来,以及如何通过在资源库(如CRAN)下载额外的包来扩展R的功能。本章的“课后研习”和“补充练习”部分,将要求读者载入RStudio,学会使用R控制台和安装第一个R包。

在接下来的两章中,将陆续介绍R中的标准数据对象,从向量到数据框结构。这些对象是R语言的构建块。你将学会如何创建、组合和从这些结构中取子集。

问:我用x <- 5这样的语法创建了一个具名对象,但是在运行X + 2这行代码时却报错:“错误:找不到对象‘X’”。这样的报错是否正确?

答:如果用过类似SAS这样的语言,会认为这种报错很奇怪。但是,这样的报错没有问题。R是区分大小写的语言,因此x和X是完全不同的。

问:同事通过.zip文件发来一个R包,但是解压缩文件后发现没法安装这个包。这是为什么?

答:R包通常以二进制或“.zip”文件发布。除非你想通过源代码创建自己的包,否则要给R提供二进制文件,也就是说不要解压缩该文件。

问:是否可以把同一个包的两个不同版本安装到不同的库中?如果这样做,在载入时会出现什么情况?

答:完全可以把同一个包的不同版本安装到不同的库中。如果未指定要载入哪一个,R会在库路径中载入一个最高级版本。让人欣慰的是,一次只能载入一个版本。如果载入一个已载入的包,R不会抛出错误或警告,所以我们建议一定要小心!

问:是否能安装R的多个版本?如果安装了多个版本,会对包库有什么影响?

答:在机器中安装R的多个版本没问题。如果在严格管制环境中工作,需要确保与早期的R版本生成完全一致的结果,就必须要安装多个版本。在RStudio中,通过Tools > Global Options...菜单可以切换R的不同版本。不过要重新启动RStudio才能生效。

系统库与R的版本相关联。因此,如果切换了R的新版本,系统库会自动更新,使用新版本的核心包和推荐包。用户库默认与版本的储存位置相同,因此使用不同版本的R包几乎没有风险。有一利就有一弊,这意味着每次安装R的新版本,都要把自己喜欢的包再安装一次。

课后研习包含“随堂测验”和“答案”两部分,旨在帮助读者巩固本章所学知识。请读者先尝试回答“随堂测验”中的所有问题,再看后面的“答案”。

随堂测验:

1.要与R进行交互,必须安装RStudio。这样的说法对不对?

2.下面哪一个不能用于R的赋值?

  A.<-

  B._

  C.->

  D.=

3.objects(4)这行代码将输出什么内容?

4.安装R包和载入R包的区别是什么?

5.Rhistory.RData文件有什么区别?

6.什么是屏蔽?

答案:

1.不对。与R进行交互的方式多种多样,RStudio只是目前最流行的一种方式。

2.答案是B。然而,你一定想不到在R之前,S语言用下划线来赋值。

3.objects(4)这行代码生成一份对象列表,这是搜索路径第4项中包含的所有对象的列表。在本章的示例中,搜索路径第4个位置上是graphics(图形)。当然,每个包所在的位置也不是固定不变的。如果载入一个新包,包在搜索路径中的位置会发生变化。

4.安装一个R包就在机器中创建了一个永久目录。通常,每个R版本只需为所需的包安装一次。而载入R包才能在R会话中真正地使用它。

5..Rhistory文件包含一份在R会话中执行命令的列表。.RData文件储存R对象,可用于重新创建上一次R会话中的全局环境对象。

6.屏蔽发生在多个“环境”(通常是包)包含同名对象时。在控制台输入一个对象名时,只要R在上一级的搜索路径中发现了与之同名的对象,其余没有被找到的同名对象都被隐藏,或称为“屏蔽”。

1.打开RStudio开始一个R会话。

2.显示出R会话的搜索路径。

3.用objects()函数列出所有"datasets"包中的所有对象。

4.在Packages窗格中从CRAN安装mangoTraining包。

5.把mangoTraining包载入R会话。

6.列出mangoTraining包中包含的对象。


相关图书

R语言编程:基于tidyverse
R语言编程:基于tidyverse
R语言医学多元统计分析
R语言医学多元统计分析
Python与R语言数据科学实践
Python与R语言数据科学实践
R数据挖掘实战
R数据挖掘实战
R语言机器学习实战
R语言机器学习实战
R语言高效能实战:更多数据和更快速度
R语言高效能实战:更多数据和更快速度

相关文章

相关课程