Welcome
这是 “Advanced R” 第二版的网站,这本书属于查普曼与霍尔的R系列。该书主要面向希望提高其编程技能和对R语言的理解的R用户。它还对从其他编程语言转向R的程序员有帮助,因为它可以帮助您理解R的工作方式。
如果您正在寻找第一版,您可以在 http://adv-r.had.co.nz/ 找到它。
许可证
创作共用许可
整个作品在创作共用署名-非商业性使用-相同方式共享4.0国际许可协议下授权。
本书中包含的代码同时也可根据MIT许可证获得;这意味着您可以自由地在您自己的程序包中使用它,只要您引用了出处。
其他书籍
您可能还对以下书籍感兴趣:
-
《Advanced R Solutions》,由Malte Grosser和Henning Bumann编写,提供了本书中练习的解答。
-
《R for Data Science》,将R作为进行数据科学的工具引入,侧重于一套称为“tidyverse”的一致性包。
-
《R Packages》,教您如何充分利用R的出色包系统。
前言
欢迎来到 《Advanced R》 第二版。在这个版本中,我有三个主要目标:
- 加强对重要概念的覆盖,这些概念在第一版出版后我才完全理解。
- 减少对时间证明不太有用的主题的覆盖,或者我认为非常令人兴奋但实际上并不太实用的主题。
- 通过更好的文本、更清晰的代码和更多的图表,使文章内容更易理解。
如果你熟悉第一版,那么这个前言将描述主要的变化,这样你可以将阅读重点放在新领域上。如果你正在阅读印刷版的这本书,你会很快注意到一个很大的变化:《Advanced R》 现在是彩色的!这极大地改善了代码块的语法高亮显示,并使创建有用的图表变得更加容易。我充分利用了这一点,在整本书中包含了100多个新的图表。
这个版本中的另一个重大变化是使用了新的包,特别是rlang包,它为低级数据结构和操作提供了更简洁的接口。第一版几乎完全使用了基础R函数,这在教学上带来了一些挑战,因为许多函数在多年来独立发展,使得难以看到隐藏在函数名和参数名的变化中的重要基本思想。我继续在边栏、脚注和需要的地方展示基础R的等效方法,但如果你想看到本书中这些思想的最原始基础的R表达,我建议阅读第一版,你可以在http://adv-r.had.co.nz找到它。
R的基础在第一版以来的五年里并没有发生变化,但我的理解肯定有所不同。因此,“Foundations”(基础)的总体结构基本保持不变,但许多单独的章节得到了很大的改进:
-
第2章,“Names and values”(名称和值),是一个全新的章节,帮助你理解对象(objects)与对象名称(names of objects)之间的区别。这有助于你更准确地预测R何时会复制数据结构,并为理解函数式编程打下了重要基础。
-
第3章,“Vectors”(向量)(以前称为数据结构(data structures)),已经重写,重点关注向量类型,如整数(integers)、因子(factors)和数据框(data frames)。它包含更多关于重要的S3向量(如日期(dates)和日期时间(date-times))的细节,讨论了tibble包提供的数据框(data frame)变体,同时反映了我对向量数据类型理解上的提升。
-
第4章,“Subsetting”(子集选择),现在通过它们的意图分为
[
和[[
:[
提取多个值,而[[
提取单个值(以前它们是以它们是否“简化”或“保留”为特征来区分)。第4.3节绘制了“train”图来帮助你理解[[
如何与列表(lists)一起使用,并介绍提供了更行为一致地处理超出边界的索引新函数(function)。 -
第5章,“Control flow”(控制流),是一个新的章节:不知何故,我之前忘记了像
if
语句和for
循环这样重要的工具! -
第6章,“Functions”(函数),在顺序上有所改进,引入了管道(
%>%
)作为组合函数(compose functions)的第三种方式(第6.3节),并在函数形式(function forms)的覆盖范围上有了很大的改进(第6.8节)。 -
第7章,“Environments”(环境),重新组织了对特殊环境的处理(第7.4节),并在调用堆栈(call stack)的讨论上有了很大的改进(第7.5节)。
-
第8章,“Conditions”(条件),包含了以前在“Exceptions and debugging”(异常和调试)中的内容,以及关于R的条件系统(condition system)如何工作的许多新内容。它还向你展示了如何创建自己的自定义条件类(custom condition classes)(第8.5节)。
在第I部分“Foundations”之后,各章节已经重新组织,围绕R中三个最重要的编程范式展开:函数式编程、面向对象编程和元编程。
-
函数式编程现在更清晰地划分为三个主要技术:第9章“Functionals”(函数式)、第10章“Function factories”(函数工厂)和第11章“Function operators”(函数运算符)。我着重关注在数据科学中具有实际应用的思想,并减少了纯理论的内容。
这些章节现在使用了 purrr 包提供的函数,这使我更专注于基本思想,而不是偶发性细节。这导致了函数运算符章节的大幅简化,因为主要用途之一是解决基本函数式中省略号(...
)的问题。 -
面向对象编程(OOP)现在构成了书中的一个主要部分,包括全新的关于基本类型(第12章)、S3(第13章)、S4(第15章)、R6(第14章)以及这些系统之间的权衡(第16章)的章节。
这些章节侧重于不同对象系统的工作原理,而不是如何有效地使用它们。很不幸,但很必要,因为许多技术细节在其他地方没有得到描述,而高效OOP需要一本专门的书。 -
元编程(以前称为“在语言上进行计算(computing on the language)”)描述了您可以使用的工具套件,以便用代码生成代码。与第一版相比,这部分内容已经大幅扩展,现在侧重于“tidy evaluation”,这是一组使元编程安全、有原则并且让更多R程序员容易理解的思想和理论。第17章“Big picture”(大局观)粗略地展示了所有组件如何配合;第18章“Expressions”(表达式)描述了基础的数据结构(underlying data structures);第19章“Quasiquotation”(准引用)涵盖了引用和去引用;第20章“Evaluation”(评估)解释了在特殊环境中对代码的评估;第21章“Translations”(翻译)将所有主题汇总,展示了如何从一种(编程)语言翻译到另一种的方法。
书的最后一部分汇总了有关编程技巧的章节:性能分析、性能测量和优化,以及Rcpp。这些内容与第一版非常相似,尽管组织结构有些不同。我对这些章节稍加改动,特别是使用了更新的包(microbenchmark -> bench,lineprof -> profvis),但大部分内容没变。
虽然第二版对现有内容有了很大的扩展,但也删除了五章:
-
词汇章节已被删除,因为它一直有点奇怪,而且有更有效的方法来呈现词汇列表,而不是在书的章节中。
-
风格章节已被替换为在线风格指南,http://style.tidyverse.org/。风格指南与新的styler包配对使用,可以自动应用许多规则。
-
C语言章节已移至https://github.com/hadley/r-internals,随着时间的推移,这将提供有关如何编写与R数据结构配合使用的C代码的指南。
-
内存章节已被删除。其中的大部分内容已经整合到第2章中,其余部分感觉过于技术性,不是很重要。
-
有关R作为一种语言性能的章节已被删除。它没有提供太多可操作的见解,并且随着R的变化已过时。