1.6 R语言的劣势以及如何克服这些劣势
在与经验丰富的技术人员讨论R语言时,技术人员通常会指出该语言存在的两大劣势。
● 陡峭的学习曲线。
● 难以处理大型数据集。
上述两个劣势确实是这门语言的两大缺点。本书作者不会刻意地美化R语言,而是给出克服这些劣势的方法。事实上,可以认为第一大劣势是暂时性的,至少针对不同个体是这样的。因为读者一旦迈过了R语言学习的“绝望谷”,就再也不会被这一劣势所困扰。什么是绝望谷呢?此处用图1-11来进行说明。
图1-11
众所周知,个体在学习全新且足够复杂的事物的过程中,都会经历3个阶段。
● 蜜月期:在这个阶段,学习者会喜欢上这样的新事物,并且非常有信心能够掌握它。
● 绝望谷:在这个阶段,所有事情都变得困难重重,让人陷入绝望。
● 接下来的阶段:学习者开始对新事物有更深入的理解,对它的掌控能力提高,自信心也越来越强。
在谈到第二大劣势时,不得不说,R语言在处理大型数据集方面存在的困难实际上是这门语言本身具有的结构性问题。因此需要在结构上对其做出一些改变,需要将其与其他工具进行战略性合作。在1.6.1节和1.6.2节中,将针对这两大劣势进行更加详细的讨论。
1.6.1 高效学习R语言,最小化精力投入
首先,R语言为什么会被视为一门很难学的语言呢?对于这个问题,没有一个普遍统一的答案,不过可以尝试推理一下其中的原因。R语言通常是进行数据分析的首选语言,它是从事数据统计的人员为他们自己,尤其是学习数据统计的学生创建的一门语言。这就决定了这门语言的两大特点。
● R语言没有很好地考虑编程体验。
● R语言具有其他语言所没有的统计技术,并且具有前所未有的创新的交互方式。
大家可以找到R语言学习曲线陡峭的原因,具体归纳如下。首先,相较于Julia和Swift这样的语言,R语言并不是一个对程序员友好的语言。正如1.2节所提到的,R语言是诞生于学术领域的一种工具。其创造者可能也没有想到,如今R语言可以被用于开发网站(更多内容请见第13章,看一看这个令人眼前一亮的应用)。
其次,学习过其他统计语言的人学习R语言时,会有一种晕头转向的感觉。在R语言中应用数据模型时,会体验到一种令人惊艳的交互过程:读者将数据输入模型,得到结果,并对结果进行分析判断;然后迭代执行上述过程,或者进行交叉验证。在该过程中,所有的操作都具有非常高的灵活性。这完全不是统计分析系统(SAS)和统计分析软件(SPSS)的用户所能够体验到的。在SAS及SPSS中,用户只能将数据提交给执行函数,然后得到一个大而全的结果集。
这就是最终结论了?难道只能被动接受历史原因所导致的陡峭的R语言学习曲线吗?当然不是。实际上,R语言社区一直在积极地参与平缓这条曲线的工作,主要的工作内容有以下两点。
● 改善R语言的编程体验。
● 编写高质量的学习资料。
1.tidyverse程序包
现如今在谈论R语言的时候,一定会提到tidyverse程序包,因为tidyverse程序包在R社区中非常流行。tidyverse是由哈德利·威克姆开发的一个框架,该框架包含很多概念和函数。由于tidyverse程序包的存在,使用R语言的编程体验更加贴近现代的编程体验。有关tidyverse程序包的介绍已经超出了本书的范围,但是本书作者还是想简单地介绍一下这个框架的组成部分,它通常至少包含以下4个程序包。
● reader:用于数据导入。
● dplyr:用于数据操作。
● tidyr:用于数据清洗。
● ggplot2:用于数据可视化。
tidyverse取得了很大的成功,因此出现了很多关于tidyverse主题的学习资料。在后文中,将介绍这些学习资料。
2.利用R语言社区来学习R语言
R语言最令人欣赏的特点之一就是它拥有一个生机勃勃的社区。起初,R语言社区主要由在其研究过程中偶遇R语言这一强大工具的统计人员和学术研究人员组成。如今,除了统计人员和学术研究人员,其他领域的专业人士也纷纷加入了R语言社区,包括金融学、化学及遗传学等领域。对于每个初学者来说,R语言社区都是一笔巨大的“财富”,社区中的人都非常友好且乐于帮助初学者迈出学习这门语言的第一步。但是读者可能会感到疑惑,要如何利用R语言社区呢?答案是,首先要找到这个社区并体验它;接下来要做的就是,看看如何利用社区主导的内容来切实可行地学习R语言。
(1)如何找到R语言社区
R语言社区存在很多种交流方式(包括各种线上和线下方式),要与R语言社区进行交流,可以通过其中的任意一种方式。下面列出的是部分线上和线下方式。
线上方式:
● R-bloggers。
● Twitter主题标签#rstats。
● Google+社区。
● Stack Overflow上被标记了R的问题。
● R-help邮件列表。
线下方式:
● R语言年度研讨会。
● RStudio开发者大会。
● R线下聚会。
(2)通过与R语言社区互动来学习R语言
既然已经知道如何找到R语言社区,那么接下来就看看如何利用社区进行学习。通常有3种可选的方式(非单选)。
● 查阅社区主导的学习资料。
● 向社区寻求帮助。
● 及时跟进R语言的最新进展。
查阅社区主导的学习资料:学习资料主要有以下两种。
● 论文、手册和图书。
● 在线交互式课程。
论文、手册和图书:虽然这种学习资料是比较传统的,但读者不应因此而忽视它们,因为这些学习资料总是能够让读者对所探讨的问题获得更加结构性而且系统性的理解。读者也可以在网络上找到论文、手册和图书形式的资料。
向读者推荐以下比较有帮助的期刊和图书。
● Advanced R。
● R for Data Science。
● An Introduction to Statistical Learning。
● OpenIntro Statistics。
● The R Journal。
在线交互式课程:这类课程应该是当前非常常见的学习资料了。在很多不同的平台上都能找到非常不错的R语言学习资料,其中知名的可能是DataCamp、Udemy和Packt。这些平台上分享的是一种实用的交互方式,读者可以通过练习和实践,直接掌握相关的主题知识,而不是被动地看着别人解释复杂的理论。
向社区寻求帮助:当开始编写第一行R语言代码时(甚至在编写代码之前),读者可能会遇到一些与编码工作相关的问题。在这种情况下,最好的方法就是向社区求助,在社区的帮助下解决这些问题。读者很可能并不是第一个提出相关问题的人。所以,在提出问题之前,可以先在网上寻找一下之前是否有人提出过类似的问题,并查看问题答案。
应该在哪里寻找答案呢?在大部分情况下,读者可以通过以下几处找到答案(按可能找到答案的概率先后列出)。
● Stack Overflow。
● R-help邮件列表。
● R程序包的文档。
但是,不建议读者在社交网络或者其他类似网站上寻找答案,因为它们并不是专注于处理这类问题的网站。在这些网站上,答案没有经过任何专业的审核,因此,在这类网站上查找到的答案可能是过时的,或者根本就是不正确的。
如果读者提出的是一个从未有人问到过的新问题,那么读者可以在前面寻找问题答案的地方进行提问。
及时跟进R语言的最新进展:由于存在很多热心用户的贡献,R语言的世界才得以不断更新、不断进步。如何紧跟这些变化呢?社交网络可以派上用场。通过关注社交网络或者类似网站的#rstats主题标签,读者就可以不断地了解R语言的动态。另外,还可以在R-bloggers上订阅每日新闻,这些新闻是由前一天发布的与R语言相关的博客文章组成的,都很实用。最后,读者可以通过R语言年度研讨会或者类似会议接触到著名的R专家,听取他们的独特见解,以及他们关于R语言未来发展的演讲。
1.6.2 使用R语言操作大型数据集
前面提到,R语言的第二大劣势与大型数据集的处理有关。那么,这个劣势来自哪里呢?实际上,这个劣势与R语言的核心机制有关,R语言是一个内存软件。也就是说,在R语言脚本中创建和管理的每一个对象都存储在计算机的RAM中。这意味着数据的总大小不能超过RAM的总大小(前提是其他软件没有占用RAM,但这是不切实际的)。那么,如何克服这个劣势呢?答案实际上超出了本书所要讲解的范围。尽管如此,作者在此简单地总结出3种应对策略。
● 优化代码,使用profvis等程序包对代码进行分析,并遵循R语言编程最佳实践。
● 使用外部数据存储和整理工具,如Spark、MongoDB和Hadoop。在后文中,会对此做进一步介绍。
● 使用ff、filehash、R.huge或者bigmemory等程序包来改变R语言内存处理行为,以尽量避免内存过载。
作为作者,我想要强调的是,这个劣势实际上是可以克服的。对于刚刚开始R语言学习之旅的初学者,在遇到这个劣势时不必担心。
最后补充说明:随着获取计算能力的成本越来越低,与大型数据集处理相关的问题就会显得越来越微不足道。