R的极客理想工具篇.pdf
http://www.100md.com
2020年11月13日
![]() |
| 第1页 |
![]() |
| 第9页 |
![]() |
| 第17页 |
![]() |
| 第25页 |
![]() |
| 第37页 |
![]() |
| 第86页 |
参见附件(4093KB,123页)。
R的极客理想·工具篇书中内容涉及计算机、互联网、数据库、大数据、统计、金融等领域,详细总结了R语言在实际使用时与Java、MySQL、Redis、MongoDB、Cassandra、Hadoop、Hive、HBase等技术综合运用的解决方案,具有实战性及可操作性强等特点。

如何阅读本书
本书的内容分为四个部分。
第一部分是R基础(第1-3章),介绍了为什么要学习R语言,R语言不同版本的安装,以及R语言中常用的12个软件包。帮助读者快速了解R语言的工具包、时间序列包和性能监控包。
第二部分是R服务器(第4-5章),介绍了R语言与其他编程语言的通信,以及R语言作为服务器的应用。帮助读者打通R语言与其他编程语言的通道,并实现R语言的服务器应用。
第三部分是数据库和大数据(第6-7章),介绍了R语言与各种数据库的通信,以及R语言与Hadoop集成。帮助读者打通R语言与各种数据库层的通道,并实现R语言对基于Hadoop大数据的处理。
第四部分是附录,介绍了Java、各种数据库以及Hadoop的安装方式。笔者希望读者可以在不借助其他参考书的情况下,完成书中所有实例。
本书为工具书,每节之间没有特别的顺序要求,你可以选择任何你感兴趣的章节进行阅读。如果你是一名初学者,想全面掌握R语言,请按顺序阅读全部的章节。
R的发展
R一直在小众领域成长着,最早也只有统计学家在用,主要用来代替SAS做统计计算。然而时代在进步,随着大数据的爆发,R终于在这一波浪潮中被工业界所发现。然后,越来越多有工程背景的人加入到这个圈子,对R的计算引擎、性能以及各种程序包进行改进和升级,让R获得了新生。
我们现在用到的R语言软件,已经越来越接近工业软件的标准了。由工程师推动的R的发展,其速度远远地超过了由统计学家推动的发展。随着人们对数据分析需求的进一步增加,R会以更快的速度继续发展,将成为的、开源的数据分析软件的代名词。
R的使用者
R语言早期主要是学术界统计学家在用,后来逐渐被其他很多领域的学者所用。R语言有各种不同的应用领域,包括统计分析、应用数学、计量经济、金融分析、财经分析、人文科学、数据挖掘、人工智能、生物信息学、生物制药、全球地理科学、数据可视化等。近几年,由互联网引发的大数据革命让工业界的人开始认识R,加入R。当越来越多的有工程背景的人加入到R语言使用者的队伍后,R才开始向着全领域发展,逐步实现工业化的要求。现在,R已不仅仅是学术界的语言,它还是工业界必备的语言。
下面列出一些推动R语言在工业界发展的R包。
RevolutionAnalytics公司的RHadoop产品,让R可以直接调用Hadoop集群资源。
RStudio公司的RStudio产品,给了我们对编辑软件新的认识。
RMySQL,ROracle,RJDBC打通了R和数据库之间的访问通道。
rmongodb,rredis,RHive,rHBase,RCassandra打通了R和NoSQL数据库之间的访问通道。
Rmpi,snow打通了单机多核并行计算的通道。
Rserve,rwebsocket打通了R语言的跨平台通信的通道。
R的思维模式
R语言让我跳出了原有的思维定式。使用R语言,我们应该像统计学家那样思考问题,而不是拘泥于程序员的思维模式。统计学家的思维模式,是先考虑为什么,再考虑做什么。
而程序员的思维模式,是直接考虑怎么做,等有了结果再考虑为什么。
R语言是直接面向数据的语言。在我们的日常生活中,无论做什么事情都会产生数据,上网有浏览数据,买东西有消费数据,就算什么都不干,也会受大气PM2.5的影响,有空气污染指数数据。利用R语言,我可以直接分析这些数据。面向什么业务,就分析什么数据,不需要从产品经理向程序员的角色转换,不需要考虑有什么功能,更不需要考虑程序设计的事。跳出程序员的思维模式,我们所能认知的东西会更多,于是也能找到更适合自己的定位。
R的极客理想工具篇截图




数据分析技术丛书
R 的极客理想—工具篇
张丹 著图书在版编目(CIP)数据
R 的极客理想—工具篇 张丹著 . —北京:机械工业出版社,2014.8
(数据分析技术丛书)
ISBN 978-7-111-47507-1
I. R… II.张… III. 程序语言-程序设计 IV. TP312
中国版本图书馆 CIP 数据核字(2014)第 170133 号
本书首先介绍了 R 的工具包、时间序列包和性能监控包;然后阐述 R 语言与其他编程语言的通信,以及 R 语言作
为服务器的应用;最后阐释R语言与各种数据库的通信以及R语言如何与Hadoop集成。附录介绍了Java、各种数
据库以及Hadoop的安装方式。书中内容涉及计算机、互联网、数据库、大数据、统计、金融等领域,详细总结了R
语言在实际使用时与 Java、MySQL、Redis、MongoDB、Cassandra、Hadoop、Hive、HBase 等技术综合运用
的解决方案,具有实战性及可操作性强等特点。
本书适合所有R语言工作者,包括软件工程师、DBA、数据科学家、科研工作者以及相关专业的学生。读者可以
选择任何感兴趣的章节进行阅读,每节之间没有特别的顺序要求。
R 的极客理想—工具篇 张丹 著
出版发行:机械工业出版社(北京市西城区百万庄大街 22 号 邮政编码:100037)
责任编辑:明永玲 责任校对:董纪丽
印 刷: 版 次:2014 年 8 月第 1 版第 1 次印刷
开 本:186mm×240mm 116 印 张:19.5
书 号: ISBN 978-7-111-47507-1 定 价:59.00 元
凡购本书,如有缺页、倒页、脱页,由本社发行部调换
客服热线:(010)88378991 88361066 投稿热线:(010)88379604
购书热线:(010)68326294 88379649 68995259 读者信箱:hzjsj@hzbook.com
版权所有·侵权必究
封底无防伪标均为盗版
本书法律顾问:北京大成律师事务所 韩光 邹晓东Foreword?序 一
生活中我是三分熟的牛排,张丹兄是五分熟的牛排,一天他给我发邮件邀请我写序,我好些天都没答复,为什么呢?因为我们互相都不熟啊!嘿嘿,好冷。从没有人找我写
过序,张丹有胆找一个浑身负能量爆棚的新手及话痨写,还说自由发挥,风格不限,作者
自己都不怕,我怕啥,大不了把脖子往你们面前一横!当然那是张丹的脖子……其实我
自己看书一般不太看推荐序(除非里面有重大八卦),因为推荐序里通常也就是友情帮点
一百二十八个赞,你要是像鲁迅先生那样半夜爬起来翻看推荐序,当然你肯定不会看见“吃
人”两个字,而是看见一个特殊的变量值:NULL。哎呀,我这只是夸张的说法啦,推荐
序没那么糟糕,我也并非和张丹完全不熟,我看过他写的很多博客文章。好了,言归正传。
在下谢益辉,身患统计学永久性脑损伤,目前在 RStudio 当码农,天天蹲 A 村村口敲代码。
十年前在中国人民大学统计学院上大三(哥也年轻过),侥幸没被统计计算课上的 R 语言折
磨死,按照我们疯人院(没有含沙射影的意思,请读者切勿自动匹配)的规矩:你上回没弄
死我,这次你在前面跑,换我来弄死你好了。就这样 R 语言成了我快乐生活的一部分。咦,为什么有一种细思恐极的感觉?
作为一名不那么极的 R 极客,我自然乐意看到一本写给极客的书。在这个数据时代
(千万别再跟我提“大”数据,否则我立刻变身纯生牛排给你看),各种新技术风起云涌,需
要有人坐一段时间冷板凳,为我们收拾整理这些技术,让那些从证明三种中心极限定理的
苦海中逃出来的研究生们毕了业不要立马又陷入另一片五种数据库引擎的苦海。我花了一
晚上加一白天的时间才看完《 R 的极客理想》的书稿,看不懂和看得懂的地方都跳着看,看不懂主要是因为我没有计算机背景(我学习的第一门计算机语言是 VB,你们笑我可以,别笑出声就好,不过我还写过 VBScript 呢,这次你们可以笑出声了),例如 Java,我多年前
曾经自学过一阵,现在都忘光了,写个“你好世界”的程序都需要搜一下;看得懂的地方
主要是纯 R 的内容,不过有些地方还是慢慢看了,比如 formatR 包那里,主要是看张丹有
没有黑我。算他识相没黑我,那好,我在序言里可以放心……黑他了;江湖险恶,你不中IV
箭谁中箭?
整本书涵盖的内容比较广,每一节的篇幅相对较短,我觉得这种写作风格挺好,每天
晚上睡前打开一节看看,在口水浸湿书之前应该可以看完一节,既能学到知识又合理利用
了睡前时间。如作者自己所说,这书不是写给初学者的,所以看第 1 章的不要被“ R 基础”
的标题给骗了,全是些奇门遁甲之术,一个基础包都没介绍!虽然我不敢讲 R 是不是最值
得学习的程序语言,但我对 1.1 节的观点深表同意:R 往往用两三行代码解决问题,不会
时时考虑最优与否(很多需要优化的地方都已经用 CFortan 等底层语言打包好了)。R“它
爹”S 语言的主要作者 John Chambers 在几十年前就说了:S 语言的目的是让我们(统计学
家)快速而可靠地把脑子里的想法变成软件。将数据拿到手之后甩开膀子从各个角度去分析
就好了,想画图画图,想跑模型跑模型,而不必先考虑定义一个结构体以及某个成员是整
型还是浮点型。书里主要用到的操作系统是 Windows 和 Ubuntu,不过苹果(OS X)用户不
必担心,R 在 OS X 上跑起来也是妥妥的,个人推荐用 Homebrew 安装 R。第 1 章介绍了一
系列奇特 R 包,从中我可以看出作者钻研这些包的乐趣,极客需要这种小乐趣的推动,后
面书中我们还会持续看到作者钻研的迹象,他胆敢把自己失败的经历都写出来,实在是很
勇敢,但这也反映了极客的真实生活嘛,哪有干什么都一帆风顺的?奇特 R 包系列里包括
了我的 formatR 包,这个包有几处小小的坑,提醒广大读者注意看文档,代码格式主要还
是得靠程序员自觉,不能老依靠 formatR 这样的自动整理代码的包。fortunes 包里的确有大
智慧(不是炒股软件),但我感觉主要还是各种恶搞和冷笑话,码农的心思你别猜,别猜别
猜。RStudio 服务器版是个好东西,未来的趋势可能是啥都存储在服务器上,浏览器控制一
切,再也没有黑乎乎的 SSH 窗口。不过前两天我一个同学给我打电话哭诉我坑了他,因为
RStudio 的服务器版太好用了,他把代码都放服务器上,每天就在浏览器里写代码,不再
从本地传来传去,结果服务器硬盘坏了,没备份。我感到很不好意思,这周打羽毛球我都
没敢再叫他。RJSONIO 的作者本来是我很敬佩的一位大极客,可能是 R 界兴趣最广泛的极
客之一,可他的代码极少写单元测试。导致我被坑了几次之后越来越不敢相信他的编码质
量,哎,上天给聪明极客的惩罚就是让他们失去单元测试。不过话说回来,什么 JavaScript
JSON 啊,HTMLCSS 啊,都是非常容易入门的技术,作为统计出身的我,大力推荐大家掌
握一点这种低投入高产出而且又有趣的计算机知识。Cairo 是另一位大极客的作品,我在他
手下呆过两个多月,其聪明程度以及掌握的计算机知识之广总令我惊叹,例如后面章节中
介绍的 Rserve、FastRWeb 以及 RCassandra 都是他单枪匹马的作品,一个比一个极,问题就
是极过了以至于很少有人知道,所以也没见广泛应用。有时候我都想,你懂得这么多东西
你家里人知道吗?他家里人知不知道没关系,起码现在我们知道张丹帮了个大忙,让他的
几份作品至少多了一些中国读者。有志于成为极客的码农们,在忍受孤独的同时,我觉得
真的应该好好想想为什么你做的东西没有广为人知,就算你不想这个问题,也该想想怎么V
到今天还没有女朋友吧,这两个问题背后肯定有共同原因。如张丹引用我的话所说,Cairo
包的高质量在现今的 R 版本中已经不算太大优势了,因为 R 本身已经支持 Cairo 库,例如
其 PNG 图片输出和 Cairo 包的输出质量上几乎是一样的,但有一个特例除外,就是散点图
中点的形状为某一个类型的圆点时(看不懂这句话的人请查阅 points 函数的帮助),基础 R
画出来有锯齿,而 Cairo 包没有,至于 pch 取值多少时有锯齿,这问题就留给你们自己去探
索吧。caTools 这个神奇到莫名其妙的包,某种程度上反映了一些 R 包作者广泛的兴趣以及
没有正规计算机背景的特点,这事情难说好坏。
也许是缘于对金融的兴趣,张丹在第 2 章介绍了时间序列数据的处理。金融是才疏学
浅的我不太能理解的行业(注定了我穷困一生的命运),时间序列也是我比较弱的功课,除
了 R 自带的 ts 函数以及简单的 ARMA 模型,我脑子里剩下的时间序列的知识已经没多少
了。zoo 和 xts 是我听过无数遍但从来没使过的 R 包,从此也可以看出 R 的应用领域太广泛
了,我用了 10 年 R 也没用过这两个流行的包,主要是因为我不太做时间序列相关的工作。
看完这一章我觉得读者不妨也研究一下 R 的基础图形,主要是 graphics 包,掌握一点基本
的画点画线技术,对图形的灵活应用会很有帮助,如今 R 的图形天下基本被 ggplot2 占据,但我还是老土的基础“图形党”(没办法,我学 R 的时候 ggplot2 还没出生),我觉得不是所
有的数据都适合 ggplot2 的。这一章介绍了时间序列数据处理以及可视化,如果是做时间序
列的预测,我听说过无数遍 forcast 包,但至今未得一试。
R 的性能一直以来都是计算机专业人士对 R 的槽点,张丹和我都表示没有压力,但
这不表示性能不是问题,当然谁都希望自己的程序跑得快,好省下几分钟时间去写另外
300 行 C 代码提升下一个程序的速度。第 3 章提供了提速以及找代码瓶颈的工具。对于
memoise 包本身我其实没太大兴趣,但它的源代码是值得一看的, R 里面的函数(或称闭包,Closure)和环境是很有意思的话题,路远坑多,慢走不送。性能监控也是一个优化代码的
重要手段,作者介绍了基础工具 Rprof 以及酷炫工具 lineprof 包,让我们知道自己的代码
的瓶颈所在。最后作者讲,R 语言需要更多 IT 人的推动,我实在不能同意更多。R 作为统
计学家写给统计学家的语言,总是会有些坑,需要专业人士来帮忙填补;另一方面,这帮
顽固的统计学家完全无视界面的重要性,看看 R 官方网站有多朴素就知道了,简直是土得
连渣都掉不下来,你跑去跟他反映,他只是一道冰冷眼神就可以杀死你。话说做网页前端
的 IT 人士你们在哪儿呢?
第二部分的两章介绍 R 的服务器应用,前面说了我是 Java 外行,所以不敢乱点评。只
记得那时候 Urbanek 大人一路上手舞足蹈给我解释 FastRWeb 的原理,然而我回去看到
varFastRWeb 这个目录的时候就已经暗自决定抛弃它了。我个人对那些需要 sudo 才能运
行且存放在非标准位置的程序有抵触心理,因为我下次一定会忘记怎么运行它以及配置文
件在什么位置。Rserve 和 FastRWeb 在它们被发明的年代里绝对都是划时代的,在服务器VI
端跑基于 R 的服务是很多码农的梦想,还记得那些年我们一起追的 Rweb 吗?如今回头看
看,还有多少人记得并用着 CGI ?可喜的是,张丹在第 5 章也介绍了 WebSocket 技术,这
也是一个相对较新、很有趣且有用的话题,建议读者好好研究。书中提到 websockets 包已
经被移出 CRAN,什么原因我也不知道,不过我基本上确定 httpuv 包可以取代它,也许是
websockets 的作者看到 httpuv 的工作之后决定不要重复劳动了。httpuv 包是 shiny 包的核心
技术之一,如今捣鼓 R 的服务器端应用,怎么能忽略 shiny ? shiny 比 RserveFastRWeb 出
现晚了近十年,为什么前者迅速流行起来,而后者尽管带着划时代的思想和技术,却被广
大用户忽略,极客们应该再次好好想想。有读者可能会说,切,shiny 是你们厂(RStudio)
的产品,你当然自卖自夸啦!是不是这样呢,我们且留给时间检验。
第三部分的两章就是数据库八仙过海各显神通了,我仅仅粗浅了解一点 MySQL,请
HadoopNoSQL 同行们不要笑出声。作为入门教程,这些章节都不错,从安装到“你好世
界”的例子都有介绍,十八般武艺入门之后的事情大家都知道,遇到问题搜索就是了。
极客不是一种身份,而是一种态度。在我眼里,这个词是中性的,极客不代表一个人
有多牛,而是他的钻研态度、好奇心以及对新技术的识别和接受能力。有些很牛很聪明的
人,未必能把聪明才智转化为生产力(请勿对号入座)。张丹这本书给大家提供了一条通向
R 的极客之路,但这绝对不是终点。技术人士容易沉迷于技术,就像科学研究人士迷信某
一种科学一样,唉,我就是这样浑身负能量。希望读者通过这本书能感受到作者探索的乐
趣,保持开放心态,积极学习,然后找到适合自己的极客理想(以及女朋友!相信我,后者
会让前者更快实现)。写序似乎应该说点鼓励的话吧,我没写过也不清楚贵圈的规矩,那么
就引用麦太的话好了:从前有一位小朋友他很努力学习,后来他发财了。
谢益辉
2014 年 6 月 23 日于 A 村
(吝啬的房东一直不给我修空调,已热哭,决定在最后这个黄金广告位狠狠黑她一把,叫她随便得罪码农!)Foreword?序 二
我有时会问自己会不会因为名字而买一本书?当我看到“ R 的极客理想”时,我就找
到了答案。把这个书名做个分词,去除停止词之后有三个词:“ R”、“极客”和“理想”。
这是耐人寻味的三个词。
R 是我现在谋生的工具,我对它有着十多年的感情。我亲历了 R 从和 GAUSS 进行比较
的时代走过和 SAS 进行比较的时代、来到了和 Python 及 Julia 这样的语言进行比较的时代,从最开始的无人问津到如今的炙手可热。R 的资料在互联网上可以说汗牛充栋,但是中文
书籍仍然很少。张丹是圈内著名的博主,明永玲是圈内著名的编辑,有幸被邀约写这篇序
言时,我对这个组合非常看好。
阅读内容之后,我发现这本书有太多和其他 R 语言书籍不一样的地方。传统的 R 语言
书籍大多是基于统计的思维展开的,通过介绍统计方法在 R 中的实现来学习 R,这就使得
很多统计出身的用户可以很容易地和其他统计软件进行类比,从而加速学习的过程。进入
大数据的时代后,R 作为数据处理的神器也越来越受关注,R 语言的书籍也开始以数据为中
心,从数据的获取、处理、分析一直到可重复研究和可视化展现,在应用层面进行全方位
的介绍。但是,作为一种编程语言,程序员视角的 R 书籍还是非常少的。张丹的这本书刚
好可以覆盖这部分的内容。
极客是 R 圈中比较少见的一种生物,尤其是来自极客之乡 IT 界的正宗极客。R 的最初
用户基本上都是统计圈的,但是最近几年 R 能够在国内越来越火,主要得益于 IT 界的贡
献。R 在欧美火的时间更早,但发展的趋势也大抵如此。从 R 的本性来说,它本不该是极
客关注的语言,因为其对外部功能延伸的追求远甚于对内部语言完美的追求,从 S 语言设
计之初就声明了人的时间远比计算机的时间宝贵,尤其是分析建模人员的时间。这种比较
乡愿的风格最初是不为极客所喜的。但是因为其极端易用,在惜时如金的产业界快速地流
行了起来,自然而然地产生了大量的难题。于是高贵冷艳、魅惑狂狷的极客们就参与进来
了。我认识的张丹,就是这样一位极客。VIII
R 是一个很奇怪的东西,没有编程基础的人可以很容易地入门,但是很难有信心觉得
自己成了高手。编程高手初学时常常是破口大骂,但是很快就中了 R 的迷毒。说到底,还
是因为 R 本质上是统计学家发明的语言,和模型打交道的能力比和计算机打交道的能力更
强大。虽然如此,随着 R 的扩展包越来越丰富,用户在享受便利性的同时也增加了理解上
的风险,函数背后的机制不再是黑箱,那么,R 中的 IT 高手的见解就变得非常重要。从他
们的视角来看 R、使用 R,无论是对于统计背景还是 IT 背景的用户都有很强的借鉴意义。
R 流的是实用主义的血,看上去和理想是背道而驰的。但 R 毕竟是没有灵魂的工具,它的性格应该取决于用它的人。在张丹的这本书里,我看到了理想的光辉。我看过不少书
也自己写书,感觉介绍知识是最简单的事,但是表明观点是最困难的。对于作者来说,观
点越不鲜明就越能避免犯错。但是对于读者来说,尤其是初学的读者,很容易陷入对自己
的怀疑中。而张丹的这本书会直接告诉读者应该怎样做,照着代码操作一遍就能解决问题。
虽然有些建议可能不是最好的解决方案,但至少是足够好的,在实际的应用中可以解决问
题。在这一点上,理想主义的作者和实用主义的 R 实现了完美的结合。
当然,整本书在“R”、“极客”、“理想”之间实现了更加完美的结合。
李舰
2014 年 8 月 1 日于上海Preface?前 言
为什么要写这本书
我是一名程序员,前后做了 10 年的程序开发工作。在这 10 年间,我从程序员一路做到
架构师,经历了太多的系统和应用。我做过手机游戏,写过编程工具;做过大型Web 应用系
统,写过公司内部 CRM;做 过 SOA 的系统集成,写过基于 Hadoop 的大数据工具;做过外包,做过电商,做过团购,做过支付,做过 SNS,也做过移动 SNS。以前只用 Java,然后开始用
PHP……如同其他程序员一样,我一度陶醉于追求各种技术的创新,但始终有一个问题困扰
着我,那就是如何才能够将我所掌握的技术转变成价值?这就好比我面对着一座金山,我拥
有先进的技术,可以制作各种性能稳定、功能卓越的挖掘机器,但我不懂如何将矿石提纯,变成金子!每每看到别人利用我的技术挖掘出金子时,我只能满脸的羡慕,心中无限的不甘。
直到遇见 R 语言,我豁然开朗。R 语言为我从另外一个角度开启了宝藏的大门,也让
我对自己的职业重新思考、规划,最后坚定了我向统计、金融行业的转型。如果你也存在
以上的问题,不如随着本书一起进入 R 语言的世界,领略 R 语言特有的魅力,通过对 R 语
言的学习,重新认识大数据的价值,更深一步地提升个人价值。
随着我与统计、金融领域的朋友交流地逐步深入,我深刻地体会到,他们对 R 语言的
实际使用也存在着很大的问题和困惑。比如,他们在某些实验室环境下,使用 R 语言可以
很轻松、很顺利地实现预期效果,但是移植到真实环境下,面对浩瀚繁复的大数据,在使
用 R 语言的过程中出现了很多问题。这就好比面对一座金山,他们掌握着先进的提纯技术,但他们所使用的挖掘、采集工具却还停留在石器时代!使用工具的落后,使他们要面对大
量 R 语言之外的问题,这让他们应接不暇,甚至崩溃!有的人甚至因此认为,R 语言只是
一种实验室语言,至少以现在的技术水平无法将它运用到现实生活中,R 语言在现实生活
中广泛应用,简直是天方夜谭!
是的,如果你是一名没有计算机背景的 R 语言使用者,你在实际使用中也同样会遇到X
许多这样或那样的问题,面对这些棘手的问题寝食难安,尝试着通过各种方式寻求解决方
案。其实,在计算机领域,这些问题已经早就有了成熟、有效的解决方案。
本书的内容来自我在 R 语言实际使用过程中的经验总结,基本都是我在工作中使用 R 语
言的真实记录,其中涉及计算机、互联网、数据库、大数据、统计、金融等领域,详细总
结了 R 语言在实际使用时与 Java、MySQL、Redis、MongoDB、Cassandra、Hadoop、Hive、HBase 等技术综合运用的解决方案,具有实战性,可操作性强。如果你与 R 语言接触时间不
长,本书可以让你看到 R 语言在各行业、各领域所散发的魅力;如果你在某行业使用 R 语言
已经有一段时间了,可能在使用 R 语言的过程中遇到了瓶颈,本书将让你看到 R 语言在与其
他计算机语言结合后所迸发的强大活力;如果你是技术人员,本书中有全局观的案例实施,也许会给你带来新的启发,甚至跟我一样,重新规划自己的职业生涯,找到学习、奋斗的新
方向;如果你是企业的中高层管理者,在本书中可以看到我们已经实现的技术成果,如果需
要,你甚至可以按照书中记录的详细操作步骤,直接在企业环境中实施,直接获利!
在此,我不得不强调,本书不是入门书,不讲 R 的语法,如果你想学习 R 语言的基础
语言入门知识,那么,你来错地方了。但是,如果你已经具备了一定的 R 语言基础,但不
一定具有计算机语言背景,我将告诉你 R 语言在真实环境下到底都能够做什么,并且详细
地告诉你怎样一步一步地实施。
在与各界R语言初学者的交流中,我发现,入门后,学习R语言最大的问题,在于如何使
用R语言的众多软件包,而介绍这方面的图书很难找到,只有一些网上流传的小册子。本书涉
及了30个R语言包,并结合我的使用心得及案例分析,相信会解决大家R语言入门后的困扰。
本书是“ R 的极客理想”系列图书的第一本,姊妹篇《 R 的极客理想—高级开发篇》
将深入介绍 R 语言底层原理,并使用 R 语言开发出企业级的应用。
本书的使用环境涉及 Linux Ubuntu 和 Windows 7 两种操作系统,R 语言包的 2.15.3 和
3.0.1 两个版本,在每一节中都有明确的标识。
R 语言还在不断地进步和更新,它将引导一场数据的革命,跨学科的结合是时代趋势,也是我们的机遇!
读者对象
本书适合以下 R 语言工作者:
计算机背景的软件工程师;
数据库背景的 DBA;
数据分析背景的数据科学家;
统计背景的科研工作者;
大专院校相关专业的学生。XI
如何阅读本书
本书的内容分为四个部分。
第一部分是 R 基础(第 1 ~ 3 章),介绍了为什么要学习 R 语言,R 语言不同版本的安
装,以及 R 语言中常用的 12 个软件包。帮助读者快速了解 R 语言的工具包、时间序列包和
性能监控包。
第二部分是 R 服务器 ( 第 4 ~ 5 章 ) ,介绍了 R 语言与其他编程语言的通信,以及 R
语言作为服务器的应用。帮助读者打通 R 语言与其他编程语言的通道,并实现 R 语言的服
务器应用。
第三部分是数据库和大数据 ( 第 6 ~ 7 章 ),介绍了 R 语言与各种数据库的通信,以及
R 语言与 Hadoop 集成。帮助读者打通 R 语言与各种数据库层的通道,并实现 R 语言对基
于 Hadoop 大数据的处理。
第四部分是附录,介绍了 Java、各种数据库以及 Hadoop 的安装方式。笔者希望读者可
以在不借助其他参考书的情况下,完成书中所有实例。
本书为工具书,每节之间没有特别的顺序要求,你可以选择任何你感兴趣的章节进行
阅读。如果你是一名初学者,想全面掌握 R 语言,请按顺序阅读全部的章节。
勘误和支持
由于笔者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地
方,恳请读者批评指正。为此,笔者创建一个在线的图书交流网站 ( https:onbook.me ),方便与读者进行沟通。如果读者在阅读过程中遇到问题,也可以在网站中留言,我将尽量
在线上为你提供最满意的解答。书中的全部源代码都可以从华章公司网站(www.hzbook.
com)或本书交流网站下载,我也会及时更新代码。本书为黑白印刷,关于更绚丽的彩色图
片,读者运行源代码即可看到。如果你有什么宝贵意见,欢迎发送邮件至 bsspirit@gmail.
com,期待能够得到你真挚的反馈。
致谢
感谢我的团队,林伟林、林伟平、邓一硕,让我们因 R 语言走到一起。感谢机械工业
出版社华章公司的编辑明永玲,帮助我审阅全部章节,引导我顺利完成书稿。感谢我的爸
爸、妈妈和爱人,感谢你们对我工作上的支持和生活上的照顾!
谨以此书献给我最亲爱的家人以及众多 R 语言爱好者们!
张丹
2014 年 5 月于中国北京目 录? Contents
序一
序二
前言
第一部分 R 基础
第 1 章 R 语言基础包 ········································································································ 2
1.1 R 是最值得学习的编程语言 ······················································································ 2
1.1.1 我的编程背景 ················································································································ 3
1.1.2 为什么我会选择 R ········································································································· 3
1.1.3 R 的应用前景 ················································································································ 7
1.1.4 时代赋予 R 的任务 ········································································································ 8
1.2 R 的历史版本安装 ····································································································· 8
1.2.1 R 在 Windows 中安装 ···································································································· 9
1.2.2 R 在 Linux Ubuntu 中安装 ·························································································· 10
1.2.3 R 的最新版本安装 ······································································································· 10
1.2.4 R 的指定版本安装 ······································································································· 10
1.3 fortunes 记录 R 语言的大智慧··················································································11
1.3.1 fortunes 介绍 ··············································································································· 12
1.3.2 fortunes 安装 ··············································································································· 12
1.3.3 fortunes 包的使用 ········································································································ 12
1.4 formatR 代码自动化排版 ························································································ 13XIII
1.4.1 formatR 介绍 ··············································································································· 13
1.4.2 formatR 安装 ··············································································································· 14
1.4.3 formatR 的使用 ··········································································································· 14
1.4.4 formatR 的源代码解析 ································································································ 20
1.4.5 源代码中的 Bug ·········································································································· 21
1.5 多人在线协作 R 开发 RStudio Server ······································································ 22
1.5.1 RStudio 和 RStudio Server ·························································································· 22
1.5.2 RStudio Server 安装 ···································································································· 22
1.5.3 RStudio Server 使用 ···································································································· 23
1.5.4 RStudio Server 多人协作 ····························································································· 26
1.6 R 和 JSON 的傻瓜式编程 ························································································ 29
1.6.1 rjson 包介绍 ················································································································ 29
1.6.2 RJSONIO 包介绍········································································································· 33
1.6.3 自定义 JSON 的实现 ··································································································· 36
1.6.4 JSON 性能比较 ··········································································································· 38
1.7 R 语言的高质量图形渲染库 Cairo ·········································································· 40
1.7.1 Cairo 介绍 ··················································································································· 40
1.7.2 Cairo 包安装 ················································································································ 40
1.7.3 Cairo 使用 ··················································································································· 41
1.8 caTools:一个奇特的工具集 ··················································································· 46
1.8.1 caTools 介绍 ················································································································ 47
1.8.2 caTools 安装 ················································································································ 48
1.8.3 caTools 使用 ················································································································ 48
第 2 章 时间序列基础包 ································································································· 58
2.1 R 语言时间序列基础库 zoo ····················································································· 58
2.1.1 zoo 包介绍 ··················································································································· 59
2.1.2 zoo 安装 ······················································································································ 60
2.1.3 zoo 包的使用 ··············································································································· 60
2.2 可扩展的时间序列 xts ····························································································· 75
2.2.1 xts 介绍 ······················································································································· 75
2.2.2 xts 包的安装 ················································································································ 78
2.2.3 xts 包的使用 ················································································································ 78XIV
2.3 时间序列可视化 plot.xts ·························································································· 93
2.3.1 xtsExtra 介绍 ··············································································································· 93
2.3.2 xtsExtra 安装 ··············································································································· 93
2.3.3 xtsExtra 包的使用········································································································ 94
第 3 章 R 性能监控包 ·····································································································104
3.1 R 语言本地缓存工具 memoise ···············································································104
3.1.1 memoise 介绍 ·············································································································105
3.1.2 memoise 安装 ·············································································································105
3.1.3 memoise 使用 ·············································································································105
3.1.4 memoise 函数源代码分析 ························································································106
3.2 R 语言性能监控工具 Rprof ····················································································108
3.2.1 Rprof 函数介绍 ········································································································109
3.2.2 Rprof 函数的定义 ····································································································109
3.2.3 Rprof 函数使用 : 股票数据分析案例 ·······································································109
3.2.4 Rprof 函数使用 : 数据下载案例 ··············································································112
3.2.5 用 profr 包可视化性能指标 ························································································113
3.2.6 Rprof 的命令行使用 ···································································································115
3.3 R 语言性能可视化工具 lineprof ·············································································116
3.3.1 lineprof 介绍 ···············································································································117
3.3.2 lineprof 安装 ···············································································································117
3.3.3 lineprof 使用 ···············································································································118
第二部分 R 服务器
第 4 章 R 语言的跨平台通信 ························································································122
4.1 Rserve 与 Java 的跨平台通信 ·················································································122
4.1.1 Rserve 安装 ················································································································123
4.1.2 用 Java 远程连接 Rserve ····························································································124
4.2 Rsession 让 Java 调用 R 更简单 ·············································································126
4.2.1 Rsession 下载 ·············································································································126
4.2.2 用 Eclipse 构建 Rsession 项目 ····················································································127XV
4.2.3 Rsession 的 API 介绍 ·································································································128
4.2.4 Rsession 使用 ·············································································································129
4.3 解惑 rJava R 与 Java 的高速通道 ···········································································132
4.3.1 rJava 介绍 ···················································································································133
4.3.2 rJava 安装 ···················································································································133
4.3.3 rJava 实现 R 调用 Java ·······························································································134
4.3.4 rJava(JRI) 实现 Java 调用 R (Windows 7) ··································································135
4.3.5 rJava(JRI) 实现 Java 调用 R (Ubuntu) ········································································137
4.4 Node.js 与 R 跨平台通信 ························································································137
4.4.1 Node.js 简单介绍········································································································138
4.4.2 R 语言配置环境 ·········································································································138
4.4.3 Node.js 配置环境········································································································139
4.4.4 Node.js 与 R 跨平台通信 ····························································································139
第 5 章 R 的服务器实现 ·································································································143
5.1 R 语言服务器程序 Rserve 详解 ··············································································143
5.1.1 Rserve 的启动 ············································································································144
5.1.2 Rserve 高级使用:Rserve 配置管理 ···········································································146
5.1.3 Rserve 高级使用:用户登录认证 ···············································································148
5.2 Rserve 的 R 语言客户端 RSclient ···········································································149
5.2.1 配置 Rserve 服务器 ····································································································150
5.2.2 RSclient 安装 ··············································································································150
5.2.3 RSclient 的 API ··········································································································151
5.2.4 RSclient 的使用 ··········································································································152
5.2.5 两个客户端同时访问 ··································································································152
5.3 FastRWeb:跑在 Web 上的 R 程序 ·········································································153
5.3.1 FastRWeb 介绍 ···········································································································154
5.3.2 FastRWeb 安装 ···········································································································155
5.3.3 FastRWeb 使用 ···········································································································156
5.4 R 语言构建 Websocket 服务器 ···············································································159
5.4.1 websockets 介绍 ·········································································································159
5.4.2 websockets 安装 ·········································································································160
5.4.3 快速启动 websockets 服务器 demo ············································································162XVI
5.4.4 R 语言创建 Websocket 服务器实例 ············································································163
5.4.5 R 语言创建 Websocket 客户端连接 ············································································163
5.4.6 用浏览器 HTML5 原生 API 客户端连接 ····································································164
第三部分 数据库和大数据
第 6 章 数据库和 NoSQL ······························································································168
6.1 RMySQL 数据库编程指南 ·····················································································168
6.1.1 RMySQL 在 Linux 下安装··························································································169
6.1.2 RMySQL 在 Windows 7 下安装 ·················································································173
6.1.3 RMySQL 函数使用 ····································································································176
6.1.4 RMySQL 案例实践 ····································································································181
6.2 R 利剑 NoSQL 之 MongoDB ··················································································183
6.2.1 MongoDB 环境准备 ·························································································183
6.2.2 rmongodb 函数库 ·······································································································185
6.2.3 rmongodb 基本使用操作 ····························································································187
6.2.4 rmongodb 性能测试的案例·························································································189
6.3 R 利剑 NoSQL 之 Redis ·························································································192
6.3.1 Redis 环境准备 ···········································································································192
6.3.2 rredis 函数库 ··············································································································193
6.3.3 rredis 基本使用操作 ···································································································194
6.3.4 rredis 测试案例 ···········································································································198
6.4 R 利剑 NoSQL 之 Cassandra ··················································································200
6.4.1 Cassandra 环境准备 ····································································································200
6.4.2 RCassandra 函数库 ·····································································································201
6.4.3 RCassandra 基本使用操作 ··························································································202
6.4.4 RCassandra 使用案例 ·································································································204
6.4.5 Cassandra 的没落 ·······································································································205
6.5 R 利剑 NoSQL 之 Hive ···························································································206
6.5.1 Hive 环境准备 ············································································································207
6.5.2 RHive 安装 ·················································································································208
6.5.3 RHive 函数库 ·············································································································209XVII
6.5.4 RHive 基本使用操作 ··································································································209
6.6 用 RHive 从历史数据中提取逆回购信息 ·······························································212
6.6.1 逆回购简介 ·················································································································212
6.6.2 历史数据存储结构 ·····································································································213
6.6.3 通过用 RHive 提取数据 ·····························································································213
6.6.4 策略模型及实现 ·········································································································216
第 7 章 RHadoop ························································································································222
7.1 R 语言为 Hadoop 注入统计血脉 ·····················································································222
7.1.1 Hadoop 介绍 ···············································································································223
7.1.2 为什么要让 Hadoop 结合 R 语言 ···············································································224
7.1.3 如何让 Hadoop 结合 R 语言 ·······················································································225
7.1.4 展望未来 ····················································································································226
7.2 RHadoop 安装与使用 ·····························································································226
7.2.1 环境准备 ····················································································································227
7.2.2 RHadoop 安装 ············································································································227
7.2.3 RHadoop 程序开发 ·····································································································229
7.3 RHadoop 实验:统计邮箱出现次数 ·······································································233
7.3.1 需求描述 ····················································································································233
7.3.2 算法实现 ····················································································································234
7.4 RHadoop 实现基于 MapReduce 的协同过滤算法 ···················································236
7.4.1 基于物品推荐的协同过滤算法介绍 ···········································································236
7.4.2 R 语言本地程序实现 ··································································································237
7.4.3 R 基于 Hadoop 分步式程序实现 ················································································242
7.5 rhbase 安装与使用 ··································································································249
7.5.1 HBase 环境准备 ·········································································································250
7.5.2 rhbase 安装 ·················································································································250
7.5.3 rhbase 函数库 ·············································································································251
7.6 解决 RHadoop 安装错误:PipeMapRed.waitOutputThreads ································253
7.6.1 rmr2 运行错误日志 ····································································································254
7.6.2 定位错误到 Hadoop 日志 ···························································································255
7.6.3 从 Hadoop 入手找解决办法 — 失败 ··········································································256
7.6.4 从 RHadoop 入手找解决办法 — 成功 ········································································257XVIII
第四部分 附 录
附录 A Java 环境安装 ···································································································262
附录 B MySQL 数据库安装 ··························································································266
附录 C Redis 数据库安装 ······························································································270
附录 D MongoDB 数据库安装 ·····················································································273
附录 E Cassandra 数据库安装 ·····················································································277
附录 F Hadoop 安装 ······································································································280
附录 G Hive 环境安装 ···································································································287
附录 H HBase 安装 ········································································································290第一部分
R 基础
■
第1章 R语言基础包
■
第2章 时间序列基础包
■
第3章 R性能监控包
Part 1第 1 章
R 语言基础包
本章主要介绍了为什么要学习 R 语言,R 语言软件的安装,R 语言的开发工具,以及 R
语言中常用的几个软件包,以帮助读者快速了解 R 语言的工具包,激发读者对 R 语言的学
习兴趣。
1.1 R 是最值得学习的编程语言
问题
为什么要学 R 语言?
Chapter 1第 1 章 R 语言基础包 3
引言
如果要问在 Node、Lua、Python、Ruby 和 R 这 5 种语言中,哪个语言在 2014 年的应
用前景会更好,我会毫不犹豫地选择 R,而且我认为 R 语言不仅是 2014 年,也是以后更长
一段时间内的明星。在本书开篇,我们就谈谈为什么 R 语言是最值得学习的编程语言。
1.1.1 我的编程背景
本人是程序员、架构师,从编程入门到今天,一直深信着 Java 是改变世界的语言,Java 已经做到了,而且一直很辉煌。但当 Java 越来越强大,覆盖领域越来越多,变得无所
不能的时候,它反而不够专业,这就给了其他语言发展的机会。
我已使用 Java 语言 11 年,R 语言 3 年,Node 1 年,对于这个问题 “哪个语言在 2014
年的应用前景会更好”,我选择 R 语言。
1.1.2 为什么我会选择 R
从下面的 9 个方面来说明我选择 R 的原因。
R 的基因
R 的发展
R 的社区和资源
R 的哲学
R 的使用者
R 的语法
R 的思维模式
R 解决的问题
R 的不足
1. R 的基因
1992 年,新西兰奥克兰大学的 Ross Ihaka 和 Robert Gentleman 两位统计学家,为了方
便教授初等统计课程,发明了一种编程语言,因为他们名字的首字母都是 R,于是 R 便成
为这门语言的名称。
从开始学习 R 语言,我就开始了知识的跨界思考。统计学基于概率论,概率论又基于
数学,用计算机的方式编程,同时解决某个领域的实际问题。多种学科知识的交集,决定
着我们解决问题的能力。统计的基因,让 R 语言与众不同!第一部分 R 基础 4
2. R 的发展
R 一直在小众领域成长着,最早也只有统计学家在用,主要用来代替 SAS 做统计计算。
然而时代在进步,随着大数据的爆发,R 终于在这一波浪潮中被工业界所发现。然后,越
来越多有工程背景的人加入到这个圈子,对 R 的计算引擎、性能以及各种程序包进行改进
和升级,让 R 获得了新生。
我们现在用到的 R 语言软件,已经越来越接近工业软件的标准了。由工程师推动的 R
的发展,其速度远远地超过了由统计学家推动的发展。随着人们对数据分析需求的进一步
增加,R 会以更快的速度继续发展,将成为免费的、开源的数据分析软件的代名词。
3. R 的社区和资源
R 的发展离不开 R 的各种社区支持,尤其是 R 的官方社区支持。在 R 的官方网站中,我
们可以下载到 R 语言软件、R 的第三方软件包和 R 的其他支持软件。当然,我不得不承认 R
的官方网站 ( http:www.r-project.org ) 从 Web 页上看起来太简陋了,稍微调整一下CSS 样
式表,都会比现在好看很多。也许这种简单、无修饰也是统计学家的基因吧。R 语言的社区
资源同其他语言一样丰富,除了官方社区,还有开发者论坛( http:r.789695.n4.nabble.com )、R-Journal 列表 ( http:journal.r-project.org )、软件包列表、R 语言图书列表以及 R 用户组等。
R 是自由软件,因此开发者可以开发自己的软件包,封装自己的功能,然后在 CRAN
(http:cran.rstudio.com) 上面发布。截止到 2014 年 2 月,共有 5236 个 R 包在 CRAN 上
面发布。可能很多人会说只有 5236 个包,数量太少了。这是因为 CRAN 是需要提交申请
的,每个包都必须经过 R 语言小组审核、检查后才会发布出来,而且审核非常严格。高质
量是发布一个新的 R 包的基本要求。由于 CRAN 过于严格的审查,让很多开发者选择在
RForge( https:r-forge.r-project.org ) 上发布 R 包,还有些 R 包是基于 Github 发布的,我也
在 Github 上面发布了自己的 R 包:https:github.combsspiritchinaWeather 。
下面列出与 R 语言相关的主要社区和资源。
R 官方网站:http:www.r-project.org
R 开发者论坛:http:r.789695.n4.nabble.com
CRAN:http:cran.rstudio.com
RForge:https:r-forge.r-project.org
R 新闻和博客:http:www.r-bloggers.com
统计之都:http:cos.name
4. R 的哲学
每种语言都有自己的设计理念和哲学,而我体会的 R 的哲学就是“静下心做事情”。R第 1 章 R 语言基础包 5
不需要很长的代码,也不需要设计模式。一个函数调用,传几个参数,就能实现一个复杂
的统计模型。我们需要思考的是用什么模型、传什么参数,而不是怎么进行程序设计。我
们可能会用 R 实现“从一个数学公式,变成一个统计模型”的过程,我们也可能会考虑“如
何让一个分类器结果更准确”,但我们不必思考一个算法的“时间复杂度是多少,空间复杂
度是多少”。
R 的哲学,可以让你把数学和统计学的知识,变成计算模型,这也是 R 的基因所决定的。
5. R 的使用者
R 语言早期主要是学术界统计学家在用,后来逐渐被其他很多领域的学者所用。R 语言
有各种不同的应用领域,包括统计分析、应用数学、计量经济、金融分析、财经分析、人
文科学、数据挖掘、人工智能、生物信息学、生物制药、全球地理科学、数据可视化等。
近几年,由互联网引发的大数据革命让工业界的人开始认识 R,加入 R。当越来越多的
有工程背景的人加入到 R 语言使用者的队伍后,R 才开始向着全领域发展,逐步实现工业
化的要求。现在,R 已不仅仅是学术界的语言,它还是工业界必备的语言。
下面列出一些推动 R 语言在工业界发展的 R 包。
RevolutionAnalytics 公司的 RHadoop 产品,让 R 可以直接调用 Hadoop 集群资源。
RStudio 公司的 RStudio 产品,给了我们对编辑软件新的认识。
RMySQL、ROracle、RJDBC 打通了 R 和数据库之间的访问通道。
rmongodb、rredis、RHive、rHBase、RCassandra 打通了 R 和 NoSQL 数据库之间的
访问通道。
Rmpi、snow 打通了单机多核并行计算的通道。
Rserve、rwebsocket 打通了 R 语言的跨平台通信的通道。
6. R 的语法
R 是面向对象语言,语法如同 Python。但 R 的语法很自由,很多函数的名字看起来都
是那么随意,这也是 R 的哲学的一部分吧!例如,看到如下这样的赋值语法,有其他语言
基础的程序员,肯定会崩溃的。
> a<-c(1,2,3,4)->b
> a
[1] 1 2 3 4
> b
[1] 1 2 3 4
随机取正态分布 N(0,1) 的 10 个数,又是这么的简单。第一部分 R 基础 6
> rnorm(10)
[1] -0.694541401 1.877780959 -0.178608091 0.004362026
[5] 0.836891967 1.794961298 0.115284187 0.155175219
[9] 0.464028612 -0.842569561
用 R 画鸢尾花的数据集的散点图,有非常好的可视化效果。
> data(iris) 加载数据集
> head(iris) 查看前6行数据集
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> plot(iris) 画图
输出结果见图 1-1。
图 1-1 鸢尾花的数据集的散点图
正是因为 R 自由的哲学,让 R 的语法独特而简洁,我已经喜欢上这种哲学了。第 1 章 R 语言基础包 7
7. R 的思维模式
R 语言让我跳出了原有的思维定式。使用 R 语言,我们应该像统计学家那样思考问题,而不是拘泥于程序员的思维模式。统计学家的思维模式,是先考虑为什么,再考虑做什么。
而程序员的思维模式,是直接考虑怎么做,等有了结果再考虑为什么。
R 语言是直接面向数据的语言。在我们的日常生活中,无论做什么事情都会产生数据,上网有浏览数据,买东西有消费数据,就算什么都不干,也会受大气 PM2.5 的影响,有空
气污染指数数据。利用 R 语言,我可以直接分析这些数据。面向什么业务,就分析什么数
据,不需要从产品经理向程序员的角色转换,不需要考虑有什么功能,更不需要考虑程序
设计的事。跳出程序员的思维模式,我们所能认知的东西会更多,于是也能找到更适合自
己的定位。
8. R 解决的问题
当数据成为生产资料的时候,R 就是为人们能运用生产资料创造价值的生产工具,R 语
言主要解决的是数据的问题。整个人类文明所获得的全部数据中,有 90% 以上是自互联网
诞生以来产生的;当 Hadoop 帮助人们解决了大数据存储的问题后,如何发现数据的价值,则成为当前最火的话题。R 语言具有强大的统计分析能力,这就让它成为数据分析最好的
工具。所以,R 要解决的问题,就是如何挖掘数据价值的问题。
9. R 的不足
尽管前面说了 R 的各种优点,但我们依然不能说 R 就是完美无缺的,因为 R 也有很多
不足。具体来说,R 的缺点有下面 5 个。
R 软件是统计学家编写的,并不如软件工程师编写的软件那么健壮。
R 软件的性能,存在一些问题。
R 语言很自由,语法命名不太规范,需要花时间熟悉。
R 语言的内核编程,要比普通的 R 包使用,难度大得多。
R 语言结合了很多数学、概率、统计的基础知识,学起来有一定门槛。
R 的这些不足,都是可以克服的。当有更多有工程背景的人加入的时候,R 语言会比现
在更强大,会帮助使用者创造更多的价值。
1.1.3 R 的应用前景
R 可以做所有 SAS 能做的事情。SAS 系统全称为 Statistics Analysis System,是国际上
最知名的商业分析软件工具之一。SAS 用于决策支持的大型集成信息系统,其重要组成部
分和核心功能是统计分析功能。在数据处理和统计分析领域,SAS 系统被誉为国际上的标第一部分 R 基础 8
准软件系统,堪称统计软件界的巨无霸。
R 和 SAS 处于完全的竞争的关系中,R 的免费和开放,让 R 有着更广阔的应用前景。
下面给出当今 R 应用最热门的领域。
统计分析:统计分布、假设检验、统计建模。
金融分析:量化策略、投资组合、风险控制、时间序列、波动率。
数据挖掘:数据挖掘算法、数据建模、机器学习。
互联网:推荐系统、消费预测、社交网络。
生物信息学:DNA 分析、物种分析。
生物制药:生存分析、制药过程管理。
全球地理科学:天气、气候、遥感数据。
数据可视化:静态图、可交互的动态图、社交图、地图、热图、与各种 JavaScript 库
的集成。
本书会介绍 R 语言在统计分析、金融分析、数据挖掘、推荐系统、社交网络等领域的
应用。R 有着非常广阔的应用前景,而且 R 也将成为新一代的最有能力创造价值的工具。
1.1.4 时代赋予 R 的任务
R 语言是在大数据时代被工业界了解和认识的语言,R 语言被时代赋予了挖掘数据价
值、发现数据规律以及创造数据财富的任务。R 语言也是帮助人们发挥智慧和创造力的最
好的生产工具,因此我们不仅要学好 R 语言,还要用好 R 语言,为社会注入更多的创新
的生产力。
总而言之,在这 5 种语言中,R 是最特殊的,R 被赋予了与其他语言不同的使命。R 的
基因决定了 R 将成为 2014 年,也可能是以后更长一段时间的明星。因此我认为“ R 是最值
得学习的编程语言”。不论你正在读书,还是已经工作,掌握 R 语言这个工具并找最适合自
己的位置将会前途无量。
1.2 R 的历史版本安装
问题
在 Linux Ubuntu 上,如何安装不同版本的 R ?第 1 章 R 语言基础包 9
引言
R 语言已进入到了 3.0 的时代,但有些第三方的 R 包还处于 2.15 的状态,没有升级,如 RHadoop 等。我们要用这些 R 包的时候,就需要指定版本的 R 软件。对于 Windows 来
说,这是很简单的操作,只要安装不同的 (.exe) 文件就行了;对于 Linux 系统来说,就不那
么容易了,需要我们手动进行配置。不熟悉 Linux 系统的同学,在这里就很容易卡住。所
以,本节就讲一下如何在 Linux Ubuntu 系统中安装 R 语言软件包的指定版本。
1.2.1 R 在 Windows 中安装
通过 R 的官方网站 ( http:cran.r-project.org ) ,我们可以下载 Linux、MacOS、Windows 系统的 R 语言安装包。R 在 Windows 系统中安装非常简单,下载可执行文件
(.exe),双击即可进行安装。安装后就能运行 R 语言的界面,如图 1-2 所示。
图1-2 R在Windows系统中的安装界面第一部分 R 基础 10
1.2.2 R 在 Linux Ubuntu 中安装
本书使用的 Linux 是 Ubuntu 12.04.2 LTS 64bit 的系统,安装 R 语言软件包可以通过
Ubuntu 的 apt-get 工具进行安装。下面就介绍在 Linux Ubuntu 中安装 R 语言的过程。
~ R 检查R 是否已安装
The program 'R' is currently not installed. You can install it by typing:
sudo apt-get install r-base-core
~ sudo apt-get install r-base-core 根据提示安装R 语言软件包
~ R --version 检查R 的版本
R version 2.14.1 (2011-12-22)
Copyright (C) 2011 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)
前面的检查结果表明,我们安装的是 R 的默认版本,即 2.14.1 版,这与本书中 R 的版
本是不符的,接下来我们希望安装最新版本 R 的软件包。
1.2.3 R 的最新版本安装
首先,删除 Linux Ubuntu 系统中原有的 R 软件包,代码如下:
~ sudo apt-get autoremove r-base-core 删除系统中原有的R软件包
接下来,找到一个 Ubuntu 的软件源镜像(http:mirror.bjtu.edu.cncranbinlinuxubuntu ),Linux Ubuntu 12.04 对应的名字是 precise,进入到 precise 目录,找到 r-base-core 相关的文
件,发现有多个 R 的版本。把这个软件源,增加到 apt 的 sources.list 文件中,代码如下:
~ sudo sh -c echo deb http:mirror.bjtu.edu.cncranbinlinuxubuntu
precise >>etcaptsources.list 在sources.list 文件最下面,新加一行
~ sudo apt-get update 更新源
~ sudo apt-get install r-base-core 再次安装R 语言软件包
~ R –version 检查R 的版本
R version 3.0.3 (2014-03-06) -- Warm Puppy
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
这时我们就安装了最新的 R 语言版本—3.0.3 版。
1.2.4 R 的指定版本安装
由于本书中的例子,大部分是基于 3.0.1 完成的,而 RHadoop 的例子是基于 2.15.3 完第 1 章 R 语言基础包 11
成的,因此我们还需要指定 R 的安装版本。
1. 安装 R 的 2.15.3 版本
~ sudo apt-get autoremove r-base-core 删除系统中原有的R软件包
~ sudo apt-get install r-base-core=2.15.3-1precise0precise1 安装R的2.15.3 版本
~ R –version 检查R语言软件包版本
R version 2.15.3 (2013-03-01) -- Security Blanket
Copyright (C) 2013 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)
2. 安装 R 的 3.0.1 版本
~ sudo apt-get autoremove r-base-core 删除系统中原有的R软件包
~ sudo apt-get install r-base-core=3.0.1-6precise0 安装R的3.0.1版本
~ R –version 检查R语言软件包版本
R version 3.0.1 (2013-05-16) -- Good Sport
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
这样我们就可以很方便地指定安装不同版本的 R 的语言软件包,满足不同的应用需求!
1.3 fortunes 记录 R 语言的大智慧
问题
如何才能更深入地了解 R, 它的起源、成长、经历是怎样的?第一部分 R 基础 12
引言
R 语言是在大数据“火”起来后,映入人们眼球的。但 R 语言的社区已经存在很多年,我们并不知道,R 语言在很长的历史时期,有着什么样的智慧。不过,正有人悄悄地记录
着 R 语言的大智慧。
1.3.1 fortunes 介绍
fortunes 库是一个 R 语言的语录集,截至 2013 年 12 月 14 日,一共总结了 360 条
R-help 的留言。这些都是 R 语言智慧的精华,让 R 语言的后辈使用者,可以更了解 R 语言
的本身,了解 R 的精神。
1.3.2 fortunes 安装
本节使用的系统环境是:
Linux: Ubuntu 12.04.2 LTS 64bit
R: 3.0.1 x86_64-pc-linux-gnu
注 fortunes 同时支持 Windows 7 环境和 Linux 环境。
Fortunes 的安装过程如下。
~ R 启动R 程序
> install.packages(fortunes) 安装fortunes 包
> library(fortunes) 加载fortunes 包
> ?fortunes 查看帮助
1.3.3 fortunes 包的使用
fortunes 包的使用非常简单,只有一个函数 fortune。
> fortune 随机查看一条语录
Barry Rowlingson: Your grid above has 86 = 42 points.
(That was a subtle Hitchhikers Guide To The Galaxy reference there, honest, and
not a stupid dumb multiplication mistake on my part after working four 18-hour
days on the trot...)
Peter Dalgaard: [...] Don't panic, just throw yourself at the ground and miss.-- Barry Rowlingson and Peter Dalgaard
R-help (March 2004)
> fortune(108) 指定查看一条语录
Actually, I see it as part of my job to in?ict R on people who are perfectly
happy to have never heard of it. Happiness doesn't equal pro?cient and第 1 章 R 语言基础包 13
ef?cient. In some cases the pro?ciency of a person serves a greater good than
their momentary happiness.-- Patrick Burns
R-help (April 2005)
完整的语录下载地址是 http:cran.r-project.orgwebpackagesfortunesvignettesfortunes.
pdf。静下心来阅读这些智慧精华就能更了解 R 语言本身。想用好一门语言,就需要更深入
地了解它。
1.4 formatR 代码自动化排版
问题
如何写出让别人看得懂,且符合规范的代码呢?
引言
新手写的代码,大都不注重代码规范,以为实现功能就算完成了。这种代码不仅别人
不愿意读,过几个月后再看自己都会觉得很烂。不仅仅新手如此,大多数程序员写的代码
都没有考虑如何让别人看着更方便。程序员最痛苦的事情,不是每天加班写程序,而是每
天加班读懂别人写的程序。最后,有人实在忍受不了其他人的丑陋代码,便开始制定代码
编程规范,又有人去实现代码的自动化排版工具。formatR 就是这样的一个 R 语言自动化排
版的工具。
1.4.1 formatR 介绍
formatR 包是一个实用的包,提供了 R 代码格式化功能,可以自动设置空格、缩进、换第一部分 R 基础 14
行等代码格式,让代码看起来更友好。formatR 包中的 API 中主要有下面 5 个函数。
tidy.source: 对代码进行格式化
tidy.eval: 输出格式化后的 R 代码和运行结果
usage: 格式化函数定义,并按指定宽度输出
tidy.gui: 一个 GUI 工具,支持编辑并格式化 R 代码
tidy.dir: 对某个目录下,所有 R 脚本进行格式化
1.4.2 formatR 安装
本节使用的系统环境是:
Win7 64bit
R: 3.0.1 x86_64-w64-mingw32x64 b4bit
注 formatR 同时支持 Windows 7 环境和 Linux 环境。
formatR 的安装过程如下:
~ R 启动R 程序
> install.packages(formatR) 安装formatR 包
library(formatR) formatR 加载
1.4.3 formatR 的使用
1. 字符串格式化
tidy.source 函数,以字符串作为输入参数,对代码格式化。
> tidy.source(text = c({if(TRUE)1 else 2; if(FALSE){1+1, comments, } else 2}))
{
if (TRUE)
1 else 2
if (FALSE) {
1 + 1
comments
} else 2
}
通过执行 tidy.source 函数,把代码进行了重新格式化,让我们一眼就可以看得懂。
2. 文件格式化
messy.R 是一个不太规范的 R 程序文件。我们读入这个文件,然后通过 tidy.source 函
数,以文件对象作为输入参数,进行代码格式化。第 1 章 R 语言基础包 15
> messy = system.?le(format, messy.R, package = formatR)
> messy
[1] C:Program FilesRR-3.0.1libraryformatRformatmessy.R
messy.R 的原始代码输出:
> src = readLines(messy)
> cat(src,sep=\n)
a single line of comments is preserved
1+1
if(TRUE){
x=1 inline comments
}else{
x=2;print('Oh no... ask the right bracket to go away!')}
13 one space before this comment will become two!
2+2+2 'short comments'
lm(y~x1+x2, data=data.frame(y=rnorm(100),x1=rnorm(100),x2=rnorm(100)))
only'single quotes' are allowed in comments
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 comments after a long line
'a character string with \t in it'
here is a long long long long long long long long long long long long long
long long long long long long long comment
格式化后的代码输出:
> tidy.source(messy)
a single line of comments is preserved
1 + 1
if (TRUE) {
x = 1 inline comments
} else {
x = 2
print(Oh no... ask the right bracket to go away!)
}
1 3 one space before this comment will become two!
2 + 2 + 2 'short comments'
lm(y ~ x1 + x2, data = data.frame(y = rnorm(100), x1 = rnorm(100), x2 =
rnorm(100))) only 'single quotes' are allowed in comments
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +
1 + 1 + 1 comments after a long line
a character string with \t in it
here is a long long long long long long long long long long long long long第一部分 R 基础 16
long long long
long long long long comment
可以看出,格式化后的输出,经过了空格、缩进、换行、注释等处理,代码可读性就
增强了。
3. 格式化并输出 R 脚本文件
新建 R 脚本文件 demo.r。
~ vi demo.r
a<-1+1;a;matrix(rnorm(10),5);
if(a>2) { b=c('11',832);a>2;} else print('a is invalid!!')
格式化 demo.r。
> x = demo.r
> tidy.source(x)
a <- 1 + 1
a
matrix(rnorm(10), 5)
if (a > 2) {
b = c(11, 832)
a>2
} else print(a is invalid!!)
输出格式化结果到文件 demo2.r,如图 1-3 所示。
> f=demo2.r
> tidy.source(x, keep.blank.line = TRUE, ?le = f)
> ?le.show(f)
图 1-3 输出格式化结果到文件
4. 输出格式化代码和运行结果
使用 tidy.eval 函数,以字符串形式,执行 R 脚本:第 1 章 R 语言基础包 17
> tidy.eval(text = c(a<-1+1;a, matrix(rnorm(10),5)))
a <- 1 + 1
a
[1] 2
matrix(rnorm(10), 5)
[,1] [,2]
[1,] 0.65050729 0.1725221
[2,] 0.05174598 0.3434398
[3,] -0.91056310 0.1138733
[4,] 0.18131010 -0.7286614
[5,] 0.40811952 1.8288346
这样直接在当前的运行环境中,就输出了代码和运行结果。
5. 格式化函数定义
通过 usage 函数可以只打印出函数定义,跳过函数细节。以 var 函数为例,输入
var,默认会打印出一个函数细节。
> var
function (x, y = NULL, na.rm = FALSE, use)
{
if (missing(use))
use <- if (na.rm)
na.or.complete
else everything
na.method <- pmatch(use, c(all.obs, complete.obs, pairwise.complete.obs,everything, na.or.complete))
if (is.na(na.method))
stop(invalid 'use' argument)
if (is.data.frame(x))
x <- as.matrix(x)
else stopifnot(is.atomic(x))
if (is.data.frame(y))
y <- as.matrix(y)
else stopifnot(is.atomic(y))
.Call(C_cov, x, y, na.method, FALSE)
}
> usage(var) 通过usage,只打印函数定义
var(x, y = NULL, na.rm = FALSE, use)
有时候函数定义也很长,比如 lm 函数,通过 usage 的 width 参数可以控制函数的显
示宽度。第一部分 R 基础 18
> usage(lm)
lm(formula, data, subset, weights, na.action, method = qr, model = TRUE, x =
FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...)
> usage(lm,width=30) usage 的width参数,控制函数的显示宽度
lm(formula, data, subset, weights,na.action, method = qr, model = TRUE,x = FALSE, y = FALSE, qr = TRUE,singular.ok = TRUE, contrasts = NULL,offset, ...)
6. GUI 工具
tidy.gui 函数是一个 GUI 的工具,可以在界面上编辑并格式化 R 代码。首先安装
gWidgetsRGtk2 库:
> install.packages(gWidgetsRGtk2)
also installing the dependencies 'RGtk2', 'gWidgets'
打开 GUI 控制台:
> library(gWidgetsRGtk2)
> g = tidy.gui
我们输入一段不太好看的代码,如图 1-4 所示。
图 1-4 tidy的GUI
点击“转换”,结果如图 1-5 所示,可以看到,在 GUI 的编辑器中,R 语言的代码被格
式化了!第 1 章 R 语言基础包 19
图1-5 格式化后的代码
7. 格式化目录中的文件
tidy.dir 函数可以批量格式化文件,对目录中的所有文件进行格式化操作。下面新建
目录 :dir,并在目录 dir 中新建两个 R 脚本文件:dir.r, dir2.r。
~ mkdir dir 新建目录 dir
~ cd dir
~ vi dir.r 用vi新建文件dir.r
a<-1+1;a;matrix(rnorm(10),5);
~ vi dir2.r
if(a>2) { b=c('11',832);a>2;} else print('a is invalid!!')
执行 tidy.dir:
> tidy.dir(path=dir)
tidying dirdir.r
tidying dirdir2.r
分别查看 dir.r 和 dir2.r:
~ vi dir.r
a <- 1 + 1
a
matrix(rnorm(10), 5)
~ vi dir2.r
if (a > 2) {
b = c(11, 832)
a>2
} else print(a is invalid!!)第一部分 R 基础 20
我们发现不规则的代码,已经被格式化了!
1.4.4 formatR 的源代码解析
通过上面的使用,我们不难发现,formatR 包的核心函数就是 tidy.source 函数,从
Github 上面找到源代码:https:github.comyihuiformatRblobmasterRtidy.R。我将在代码
中增加注释:
tidy.source = function(
source = 'clipboard', keep.comment = getOption('keep.comment', TRUE),keep.blank.line = getOption('keep.blank.line', TRUE),replace.assign = getOption('replace.assign', FALSE),left.brace.newline = getOption('left.brace.newline', FALSE),reindent.spaces = getOption('reindent.spaces', 4),output = TRUE, text = NULL,width.cutoff = getOption('width'), ...) {
if (is.null(text)) { 判断输入来源为剪贴板
if (source == 'clipboard' Sys.info['sysname'] == 'Darwin') {
source = pipe('pbpaste')
}
} else { 判断输入来源为字符串
source = textConnection(text); on.exit(close(source))
}
text = readLines(source, warn = FALSE) 按行读取来源数据
if (length(text) == 0L || all(grepl('^\\s', text))) { 文件行数判断
if (output) cat('\n', ...)
return(list(text.tidy = text, text.mask = text))
}
if (keep.blank.line R3) { 空行处理
one = paste(text, collapse = '\n') record how many line breaks beforeafter
n1 = attr(regexpr('^\n', one), 'match.length')
n2 = attr(regexpr('\n', one), 'match.length')
}
if (keep.comment) text = mask_comments(text, width.cutoff, keep.blank.line)
注释处理
text.mask = tidy_block(text, width.cutoff, replace.assign length(grep('=', text)))
把输入的R 代码,先转成表达式,再转回字符串。用来实现对每个语句的截取
text.tidy = if (keep.comment) unmask.source(text.mask) else text.mask
对注释排版
text.tidy = reindent_lines(text.tidy, reindent.spaces) 重新定位缩进第 1 章 R 语言基础包 21
if (left.brace.newline) text.tidy = move_leftbrace(text.tidy) 扩号换行
if (keep.blank.line R3) text.tidy = c(rep('', n1), text.tidy, rep('', n2))
增加首尾空行
if (output) cat(paste(text.tidy, collapse = '\n'), '\n', ...)
在console 打印格式化后的结果
invisible(list(text.tidy = text.tidy, text.mask = text.mask))
返回,但不打印结果
}
1.4.5 源代码中的 Bug
在读源代码的过程中,我发现有一个小问题,即在 R 3.0.1 版本,没有对向右赋值操作
(->) 进行处理。我已经就这个问题给作者提 Bug 了,参见 https:github.comyihuiformatR
issues31。Bug 测试代码如下 :
> c('11',832)->x2
> x2
[1] 11 832
> tidy.source(text=c('11',832)->x2) 格式化代码
c(11, 832) <- x2
> tidy.eval(text=c('11',832)->x2)
c(11, 832) <- x2
Error in eval(expr, envir, enclos) : object 'x2' not found
Bug 已修复。作者回复:“这个问题已经在 R 3.0.2 中修正了。”
> formatR::tidy.source(text=c('11',832)->x2) 格式化代码
x2 <- c(11, 832)
> sessionInfo
R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] formatR_0.10.3第一部分 R 基础 22
formatR 包提供的功能非常实用,特别是读别人写的不规范的代码的时候。建议各 IDE
厂商能把 formatR 作为标准的格式化工具直接嵌入编辑器的工具中。让我们把阅读别人的
代码,也变成一件快乐的事情吧。
1.5 多人在线协作 R 开发 RStudio Server
问题
R 语言开发,哪个工具最好用?
引言
RStudio 是 R 语言开发中的利器,是最好用的 R 语言 IDE 集成环境。RStudio Server 更
是利器中的神器。不仅提供了 Web 的功能,可以安装到远程服务器上,通过 Web 进行访
问,还支持多用户的协作开发。如此神器,快来动手试一下吧。
1.5.1 RStudio 和 RStudio Server
RStudio 是一个强大的、免费的、开源的 R 语言集成开发环境的应用软件,可以安装在
Windows、Linux 和 Mac 不同操作系统上。RStudio Server 是一个基于 Web 访问的 RStudio
云端开发环境,需要安装在 Linux 服务器上面,支持多用户远程访问使用。
1.5.2 RStudio Server 安装
本文使用的系统环境是:
Linux: Ubuntu Server 12.04.2 LTS 64bit第 1 章 R 语言基础包 23
R: 3.0.1 x86_64-pc-linux-gnu
IP: 192.168.1.13
注 RStudio Server 只支持 Linux 系统环境。下载最新版本 RStudio Server 的地址是
http:www.rstudio.comidedownloadserver.html。
在 Linux Ubuntu 环境中,下载并安装 64 位的 Rstudio Server:
~ sudo apt-get install gdebi-core
~ sudo apt-get install libapparmor1 Required only for Ubuntu, not Debian
~ wget http:download2.rstudio.orgrstudio-server-0.97.551-amd64.deb
~ sudo gdebi rstudio-server-0.97.551-amd64.deb
安装后,RStudio Server 会自动启动运行。
~ ps -aux|grep rstudio-server 查看RStudio Server 运行进程
998 2914 0.0 0.1 192884 2568 ? Ssl 10:40 0:00 usrlib
rstudio-serverbinrserver
可以看到,RStudio Server 的服务已启动,8787 端口被打开。
1.5.3 RStudio Server 使用
通过浏览器,我们访问 RStudio Server: http:192.168.1.13:8787,IP 地址为 RStudio
Server 服务器的地址,如图 1-6 所示。
图1-6 RStudio Server登录界面第一部分 R 基础 24
RStudio Server 登录需要用 Linux 系统的用户账号。如果想增加或减少用户,直接
对 Linux 系统用户进行操作就可以了。我的环境中用户登录,用户名是 conan,密码是
conan111。登录之后看到的界面如图 1-7 所示。
图 1-7 RStudio Server的Web界面
1. RStudio Server 的系统配置
RStudio Server 主要有两个配置文件,默认文件不存在。
etcrstudiorserver.conf
etcrstudiorsession.conf
设置端口和 ip 控制:
~ vi etcrstudiorserver.conf第 1 章 R 语言基础包 25
www-port=8080 监听端口
www-address=127.0.0.1 允许访问的IP 地址,默认为0.0.0.0
重启 Rstudio Server 服务器,配置生效:
~ sudo rstudio-server restart
会话配置管理:
~ vi etcrstudiorsession.conf
session-timeout-minutes=30 会话超时时间
r-cran-repos=http:ftp.ctex.orgmirrorsCRAN 设置CRAN 资源库
2. RStudio Server 的系统管理
启动、停止、重启 RStudio Server 服务器的命令如下:
~ sudo rstudio-server start 启动
~ sudo rstudio-server stop 停止
~ sudo rstudio-server restart 重启
查看运行中的 R 进程:
~ sudo rstudio-server active-sessions
PID TIME COMMAND
6817 00:00:03 usrlibrstudio-serverbinrsession -u zd
指定 PID, 停止运行中的 R 进程:
~ sudo rstudio-server suspend-session 6817
~ sudo rstudio-server active-sessions 再次查看进程
PID TIME COMMAND
停止所有运行中的 R 进程:
~ sudo rstudio-server suspend-all
强制停止运行中的 R 进程,此操作优先级最高,立刻执行。
~ sudo rstudio-server force-suspend-session
~ sudo rstudio-server force-suspend-all
RStudio Server 临时下线,不允许 Web 访问,并给用户友好的错误提示:
~ sudo rstudio-server of?ine
rstudio-server startrunning, process 6880
RStudio Server 上线:第一部分 R 基础 26
~ sudo rstudio-server online
rstudio-server startrunning, process 6908
RStudio Server 的其他操作和单机版的 RStudio 一样。
1.5.4 RStudio Server 多人协作
1. 增加新用户和新用户组
~ sudo groupadd hadoop 创建Hadoop 用户组
~ sudo useradd hadoop -g hadoop 创建Hadoop 用户并加入到 Hadoop 用户组
~ sudo passwd hadoop 设置Hadoop 用户的密码
~ sudo adduser hadoop sudo 增加Hadoop 用户到sudo组
~ sudo mkdir homehadoop 创建Hadoop 用户的home 目录
~ sudo chown -R hadoop:hadoop homehadoop 给homehadoop目录及子目录,设置用户权限
以 Hadoop 用户登录,检查用户是否设置成功
~ ssh hadoop@localhost 通过 ssh 远程登录
~ bash
~ pwd 查看登录后的访问目录
homehadoop
新打开浏览器窗口通过 Hadoop 账号登录 ,如图 1-8 所示。
图1-8 以 Hadoop 账号登录第 1 章 R 语言基础包 27
2. Git 代码共享
首先安装 Git:
~ sudo apt-get install git
~ ssh-keygen -t rsa 生成rsa密钥对
~ cat homeconan.sshid_rsa.pub 查看公钥
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDMmnFyZe2RHpXaGmENdH9kSyDyVzRas4GtRwMNx+qQ
4QsB8xVTrIbFayG2ilt+P8UUkVYO0qtUJIaLRjGySvQzzL7JKX12+VyYoKTfKvZZnANJ414d6oZpbDw
sC0Z7JARcWsFyTW1KxOMyesmzNNdB+F3bYN9sYNiTkOeVNVYmEQ8aXywn4kcljBhVpT8PbuHl5eadSLt
5zpN6bcX7tlquuTlRpLi1e4K+8jQo67H54FuDyrPLUYtVaiTNTxWN6IU+DQ9CbfykJ0hrfDU1d1LiLQ
4K2Fdg+vcKtB7Wxez2wKjsxb4Cb8TLSbXdIKEwSOFooINw25gAamvnVvW1 conan@conan-deskop
接下来,我们需要把本地项目上传到 Github。首先在 Github 上创建一个新的项目
rstudio-demo,地址为 https:github.combsspiritrstudio-demo,通过下面的操作上传本地目
录到 rstudio-demo 项目。
~ mkdir homeconanRgithub 创建rstudio-demo 项目目录
~ cd homeconanRgithub
~ git init 初始化Git
~ git add 增加当前目录及子目录到本地 Git库
~ git commit -m '?rst comment' 在本地Git库提交
~ git remote add origin git@github.com:bsspiritrstudio-demo.git
绑定当前目录和github 的项目
~ git push -u origin master 上传本地Git库中的代码到Github
打开 RStudio 设置到 homeconanRgithub 目录,tools–>version control –> project setup,如图 1-9 所示。
图1-9 在 RStudio 中,配置Github地址第一部分 R 基础 28
在 RStudio 中修改 sayHello.r 的代码:
sayHello<-function(name){
print(paste(hello,name))
}
sayHello(Conan)
sayHello(World)
点击 tools–>version control–> commit 提交,如图 1-10 所示。
图 1-10 通过RStudio进行 Git 操作
上传到 Github,只需要点击 tools–>version control–> push,如图 1-11 所示。
图 1-11 在 Github 上查看提交的操作第 1 章 R 语言基础包 29
RStudio 有如此强大的功能,极大地降低了编程的门槛。还没有用过的同学,赶紧去体
验一把极客的感觉吧!
1.6 R 和 JSON 的傻瓜式编程
问题
如何让 R 语言的数据类型转换成 JSON 数据类型?
引言
JSON 作为一种轻量级数据格式,被大量地应用在各种程序环境中。JSON(JavaScript
Object Notation) 是 JavaScript 的内嵌的标准对象,同时也是 MongoDB 的表结构存储类型。
JSON 是半结构化的,可以表达出丰富的文档含义。JSON 文档比 XML 文档要少很多,更
适合于网络传输。早期 R 语言编程很少会用到 JSON,但随着 R 语言的壮大,R 也在伸向
各种领域,JSON 就是与其他领域的一个交点。如何让 R 语言傻瓜式转型 JSON 呢?请看下
文介绍。
1.6.1 rjson 包介绍
rjson 是一个 R 语言与 JSON 进行转换的包,非常简单,支持 R 自身语言转型和基
于 C 类库的转型两种方式。rjson 包提供的函数只有 3 个,fromJSON, newJSONParser,toJSON。 后面我们将介绍如何使用 rjson 包。本节使用的系统环境是:
Windows 7: x86_64-w64-mingw32x64 (64-bit)
R: version 3.0.1
注 rjson 同时支持 Windows 7 环境和 Linux 环境。第一部分 R 基础 30
1. 安装并加载 rjson
> install.packages(rjson) 安装rjson
> library(rjson) 加载rjson
接下来,我们进行测试。新建 JSON 文件 fin0.json:
~ vi ?n0.json
{
table1: {
time: 130911,data: {
code: [
TF1312,TF1403,TF1406
],rt_time: [
130911,130911,130911
]
}
},table2: {
time: 130911,data: {
contract: [
TF1312,TF1312,TF1403
],jtid: [
99,65,21
]
}
}
}
2. 调用函数 fromJSON: 从 JSON 到 R
从 fin0.json 文件中,读取 JSON 并解析成 R 语言对象。我们通常把字节或者文字格式
转型为程序对象的过程叫反序列化过程,与之相反的过程,叫做序列化过程。第 1 章 R 语言基础包 31
> json_data <- fromJSON(paste(readLines(?n0.json), collapse=))
> json_data
table1
table1time
[1] 130911
table1data
table1datacode
[1] TF1312 TF1403 TF1406
table1datart_time
[1] 130911 130911 130911
table2
table2time
[1] 130911
table2data
table2datacontract
[1] TF1312 TF1312 TF1403
table2datajtid
[1] 99 65 21
检查转型后,对应 R 语言的数据类型:
> class(json_data)
[1] list
> class(json_datatable2)
[1] list
> class(json_datatable2data)
[1] list
> class(json_datatable2datajtid)
[1] numeric
> class(json_datatable1datacode)
[1] character
我们看到原 JSON 对象转型后,除最内层外,其他都被解析为 R 的列表 (list) 类型,最
内层则是基本 (numeric,character) 类型。在 R 对象结构中取 JSON 数据的一个叶子节点,JSON 的索引路径为 json.table1.data.code[0]。
> json_datatable1datacode
[1] TF1312 TF1403 TF1406
> json_datatable1datacode[1]
[1] TF1312第一部分 R 基础 32
3. toJSON 从 R 到 JSON
把 R 对象转型为 JSON 串,这个过程叫做序列化过程。还以刚才的 json_data 为例。
> json_str<-toJSON(json_data)
> print(json_str)
[1] {\table1\:{\time\:\130911\,\data\:{\code\:[\TF1312\,\TF1403\,\TF1406\],\rt_time\:[130911,130911,130911]}},\table2\:{\time\:\130911\
,\data\:{\contract\:[\TF1312\,\TF1312\,\TF1403\],\jt
id\:[99,65,21]}}}
> cat(json_str)
{table1:{time:130911,data:{code:[TF1312,TF1403,TF1406],rt_time
:[130911,130911,130911]}},table2:{time:130911,data:{contract:[TF1312,TF1312,TF1403],jtid:[99,65,21]}}}
我们只要使用 toJSON 函数,就可以实现 R 对象向 JSON 的转型。如果用 print 函数
输出,结果就是带转义的输出 (\) ;如果直接用 cat 函数输出,结果就是标准的 JSON 串格
式。把 JSON 输出到文件 fin0_out.json, 有 2 种方法,即 writeLines 和 sink。
> writeLines(json_str, ?n0_out1.json) writeLines 方法
> sink(?n0_out2.json) sink 方法
> cat(json_str)
> sink
虽然写法不同,但是输出结果是一个样的,writeLines 最后新建一个空行。
{table1:{time:130911,data:{code:[TF1312,TF1403,TF1406],rt_time:
[130911,130911,130911]}},table2:{time:130911,data:{contract:[TF1312,TF1312,TF1403],jtid:[99,65,21]}}}
4. C 语言库和 R 语言库转型,并进行性能测试
我们对 fromJSON 进行性能测试:
> system.time( y <- fromJSON(json_str,method=C) )
用户 系统 流逝
0 0 0
> system.time( y2 <- fromJSON(json_str,method = R) )
用户 系统 流逝
0.02 0.00 0.02
> system.time( y3 <- fromJSON(json_str) )
用户 系统 流逝
0 0 0第 1 章 R 语言基础包 33
我们可以看到,基于 C 语言库的操作比基于 R 语言库的要快,因为数据量很小,所以
0.02 并不明显。当 JSON 串很大的时候,这个差距就会变得相当大了。fromJSON 默认使用 C
语言库的方法,所以我们平时处理不用加 method='C' 的参数。下面做 toJSON 的性能测试。
> system.time( y <- toJSON(json_data,method=C) )
用户 系统 流逝
0 0 0
> system.time( y2 <- toJSON(json_data,method = R) )
用户 系统 流逝
0.02 0.00 0.01
> system.time( y3 <- toJSON(json_data) )
用户 系统 流逝
0 0 0
解释同前。
1.6.2 RJSONIO 包介绍
RJSONIO 包,提供了 2 个主要的操作,把 JSON 串反序列化成 R 对象,把 R 对象序列化
成 JSON 串。RJSONIO 包的两个主要函数是 fromJSON, toJSON,它还包括几个辅助函数,即 asJSVars, basicJSONHandler, Bob, isValidJSON, readJSONStream。RJSONIO 包解决
了 rjson 包序列化大对象慢的问题。RJSONIO 依赖于底层的 C 语言类库 libjson。
1. 安装并加载 RJSONIO
> install.packages(RJSONIO)
> library(RJSONIO)
2. fromJSON 从 JSON 到 R
同 rjson 一样,测试 fromJSON 函数。
> json_data <- fromJSON(paste(readLines(?n0.json), collapse=))
> json_data
table1
table1time
[1] 130911
table1data
table1datacode
[1] TF1312 TF1403 TF1406
table1datart_time
[1] 130911 130911 130911第一部分 R 基础 34
table2
table2time
[1] 130911
table2data
table2datacontract
[1] TF1312 TF1312 TF1403
table2datajtid
[1] 99 65 21
我们发现与 rjson 的结果是一样,R 对象除最内层外,其他都是列表 (list) 类型。下面
取叶子节点:
> json_datatable1datacode
[1] TF1312 TF1403 TF1406
> json_datatable1datacode[1]
[1] TF1312
3. toJSON 从 R 到 JSON
做 toJSON 的性能测试:
> json_str<-toJSON(json_data)
> print(json_str)
[1] {\n \table1\: {\n \time\: \130911\,\n\data\: {\n \code\:
[\TF1312\, \TF1403\, \TF1406\ ],\n\rt_time\: [ 1.3091e+05, 1.3091e+05,1.3091e+05 ] \n} \n},\n\table2\: {\n \time\: \130911\,\n\data\: {\n
\contract\: [ \TF1312\, \TF1312\, \TF1403\ ],\n\jtid\: [99,65,21 ] \n} \n} \n}
> cat(json_str)
{
table1: {
time: 130911,data: {
code: [ TF1312, TF ......
R 的极客理想—工具篇
张丹 著图书在版编目(CIP)数据
R 的极客理想—工具篇 张丹著 . —北京:机械工业出版社,2014.8
(数据分析技术丛书)
ISBN 978-7-111-47507-1
I. R… II.张… III. 程序语言-程序设计 IV. TP312
中国版本图书馆 CIP 数据核字(2014)第 170133 号
本书首先介绍了 R 的工具包、时间序列包和性能监控包;然后阐述 R 语言与其他编程语言的通信,以及 R 语言作
为服务器的应用;最后阐释R语言与各种数据库的通信以及R语言如何与Hadoop集成。附录介绍了Java、各种数
据库以及Hadoop的安装方式。书中内容涉及计算机、互联网、数据库、大数据、统计、金融等领域,详细总结了R
语言在实际使用时与 Java、MySQL、Redis、MongoDB、Cassandra、Hadoop、Hive、HBase 等技术综合运用
的解决方案,具有实战性及可操作性强等特点。
本书适合所有R语言工作者,包括软件工程师、DBA、数据科学家、科研工作者以及相关专业的学生。读者可以
选择任何感兴趣的章节进行阅读,每节之间没有特别的顺序要求。
R 的极客理想—工具篇 张丹 著
出版发行:机械工业出版社(北京市西城区百万庄大街 22 号 邮政编码:100037)
责任编辑:明永玲 责任校对:董纪丽
印 刷: 版 次:2014 年 8 月第 1 版第 1 次印刷
开 本:186mm×240mm 116 印 张:19.5
书 号: ISBN 978-7-111-47507-1 定 价:59.00 元
凡购本书,如有缺页、倒页、脱页,由本社发行部调换
客服热线:(010)88378991 88361066 投稿热线:(010)88379604
购书热线:(010)68326294 88379649 68995259 读者信箱:hzjsj@hzbook.com
版权所有·侵权必究
封底无防伪标均为盗版
本书法律顾问:北京大成律师事务所 韩光 邹晓东Foreword?序 一
生活中我是三分熟的牛排,张丹兄是五分熟的牛排,一天他给我发邮件邀请我写序,我好些天都没答复,为什么呢?因为我们互相都不熟啊!嘿嘿,好冷。从没有人找我写
过序,张丹有胆找一个浑身负能量爆棚的新手及话痨写,还说自由发挥,风格不限,作者
自己都不怕,我怕啥,大不了把脖子往你们面前一横!当然那是张丹的脖子……其实我
自己看书一般不太看推荐序(除非里面有重大八卦),因为推荐序里通常也就是友情帮点
一百二十八个赞,你要是像鲁迅先生那样半夜爬起来翻看推荐序,当然你肯定不会看见“吃
人”两个字,而是看见一个特殊的变量值:NULL。哎呀,我这只是夸张的说法啦,推荐
序没那么糟糕,我也并非和张丹完全不熟,我看过他写的很多博客文章。好了,言归正传。
在下谢益辉,身患统计学永久性脑损伤,目前在 RStudio 当码农,天天蹲 A 村村口敲代码。
十年前在中国人民大学统计学院上大三(哥也年轻过),侥幸没被统计计算课上的 R 语言折
磨死,按照我们疯人院(没有含沙射影的意思,请读者切勿自动匹配)的规矩:你上回没弄
死我,这次你在前面跑,换我来弄死你好了。就这样 R 语言成了我快乐生活的一部分。咦,为什么有一种细思恐极的感觉?
作为一名不那么极的 R 极客,我自然乐意看到一本写给极客的书。在这个数据时代
(千万别再跟我提“大”数据,否则我立刻变身纯生牛排给你看),各种新技术风起云涌,需
要有人坐一段时间冷板凳,为我们收拾整理这些技术,让那些从证明三种中心极限定理的
苦海中逃出来的研究生们毕了业不要立马又陷入另一片五种数据库引擎的苦海。我花了一
晚上加一白天的时间才看完《 R 的极客理想》的书稿,看不懂和看得懂的地方都跳着看,看不懂主要是因为我没有计算机背景(我学习的第一门计算机语言是 VB,你们笑我可以,别笑出声就好,不过我还写过 VBScript 呢,这次你们可以笑出声了),例如 Java,我多年前
曾经自学过一阵,现在都忘光了,写个“你好世界”的程序都需要搜一下;看得懂的地方
主要是纯 R 的内容,不过有些地方还是慢慢看了,比如 formatR 包那里,主要是看张丹有
没有黑我。算他识相没黑我,那好,我在序言里可以放心……黑他了;江湖险恶,你不中IV
箭谁中箭?
整本书涵盖的内容比较广,每一节的篇幅相对较短,我觉得这种写作风格挺好,每天
晚上睡前打开一节看看,在口水浸湿书之前应该可以看完一节,既能学到知识又合理利用
了睡前时间。如作者自己所说,这书不是写给初学者的,所以看第 1 章的不要被“ R 基础”
的标题给骗了,全是些奇门遁甲之术,一个基础包都没介绍!虽然我不敢讲 R 是不是最值
得学习的程序语言,但我对 1.1 节的观点深表同意:R 往往用两三行代码解决问题,不会
时时考虑最优与否(很多需要优化的地方都已经用 CFortan 等底层语言打包好了)。R“它
爹”S 语言的主要作者 John Chambers 在几十年前就说了:S 语言的目的是让我们(统计学
家)快速而可靠地把脑子里的想法变成软件。将数据拿到手之后甩开膀子从各个角度去分析
就好了,想画图画图,想跑模型跑模型,而不必先考虑定义一个结构体以及某个成员是整
型还是浮点型。书里主要用到的操作系统是 Windows 和 Ubuntu,不过苹果(OS X)用户不
必担心,R 在 OS X 上跑起来也是妥妥的,个人推荐用 Homebrew 安装 R。第 1 章介绍了一
系列奇特 R 包,从中我可以看出作者钻研这些包的乐趣,极客需要这种小乐趣的推动,后
面书中我们还会持续看到作者钻研的迹象,他胆敢把自己失败的经历都写出来,实在是很
勇敢,但这也反映了极客的真实生活嘛,哪有干什么都一帆风顺的?奇特 R 包系列里包括
了我的 formatR 包,这个包有几处小小的坑,提醒广大读者注意看文档,代码格式主要还
是得靠程序员自觉,不能老依靠 formatR 这样的自动整理代码的包。fortunes 包里的确有大
智慧(不是炒股软件),但我感觉主要还是各种恶搞和冷笑话,码农的心思你别猜,别猜别
猜。RStudio 服务器版是个好东西,未来的趋势可能是啥都存储在服务器上,浏览器控制一
切,再也没有黑乎乎的 SSH 窗口。不过前两天我一个同学给我打电话哭诉我坑了他,因为
RStudio 的服务器版太好用了,他把代码都放服务器上,每天就在浏览器里写代码,不再
从本地传来传去,结果服务器硬盘坏了,没备份。我感到很不好意思,这周打羽毛球我都
没敢再叫他。RJSONIO 的作者本来是我很敬佩的一位大极客,可能是 R 界兴趣最广泛的极
客之一,可他的代码极少写单元测试。导致我被坑了几次之后越来越不敢相信他的编码质
量,哎,上天给聪明极客的惩罚就是让他们失去单元测试。不过话说回来,什么 JavaScript
JSON 啊,HTMLCSS 啊,都是非常容易入门的技术,作为统计出身的我,大力推荐大家掌
握一点这种低投入高产出而且又有趣的计算机知识。Cairo 是另一位大极客的作品,我在他
手下呆过两个多月,其聪明程度以及掌握的计算机知识之广总令我惊叹,例如后面章节中
介绍的 Rserve、FastRWeb 以及 RCassandra 都是他单枪匹马的作品,一个比一个极,问题就
是极过了以至于很少有人知道,所以也没见广泛应用。有时候我都想,你懂得这么多东西
你家里人知道吗?他家里人知不知道没关系,起码现在我们知道张丹帮了个大忙,让他的
几份作品至少多了一些中国读者。有志于成为极客的码农们,在忍受孤独的同时,我觉得
真的应该好好想想为什么你做的东西没有广为人知,就算你不想这个问题,也该想想怎么V
到今天还没有女朋友吧,这两个问题背后肯定有共同原因。如张丹引用我的话所说,Cairo
包的高质量在现今的 R 版本中已经不算太大优势了,因为 R 本身已经支持 Cairo 库,例如
其 PNG 图片输出和 Cairo 包的输出质量上几乎是一样的,但有一个特例除外,就是散点图
中点的形状为某一个类型的圆点时(看不懂这句话的人请查阅 points 函数的帮助),基础 R
画出来有锯齿,而 Cairo 包没有,至于 pch 取值多少时有锯齿,这问题就留给你们自己去探
索吧。caTools 这个神奇到莫名其妙的包,某种程度上反映了一些 R 包作者广泛的兴趣以及
没有正规计算机背景的特点,这事情难说好坏。
也许是缘于对金融的兴趣,张丹在第 2 章介绍了时间序列数据的处理。金融是才疏学
浅的我不太能理解的行业(注定了我穷困一生的命运),时间序列也是我比较弱的功课,除
了 R 自带的 ts 函数以及简单的 ARMA 模型,我脑子里剩下的时间序列的知识已经没多少
了。zoo 和 xts 是我听过无数遍但从来没使过的 R 包,从此也可以看出 R 的应用领域太广泛
了,我用了 10 年 R 也没用过这两个流行的包,主要是因为我不太做时间序列相关的工作。
看完这一章我觉得读者不妨也研究一下 R 的基础图形,主要是 graphics 包,掌握一点基本
的画点画线技术,对图形的灵活应用会很有帮助,如今 R 的图形天下基本被 ggplot2 占据,但我还是老土的基础“图形党”(没办法,我学 R 的时候 ggplot2 还没出生),我觉得不是所
有的数据都适合 ggplot2 的。这一章介绍了时间序列数据处理以及可视化,如果是做时间序
列的预测,我听说过无数遍 forcast 包,但至今未得一试。
R 的性能一直以来都是计算机专业人士对 R 的槽点,张丹和我都表示没有压力,但
这不表示性能不是问题,当然谁都希望自己的程序跑得快,好省下几分钟时间去写另外
300 行 C 代码提升下一个程序的速度。第 3 章提供了提速以及找代码瓶颈的工具。对于
memoise 包本身我其实没太大兴趣,但它的源代码是值得一看的, R 里面的函数(或称闭包,Closure)和环境是很有意思的话题,路远坑多,慢走不送。性能监控也是一个优化代码的
重要手段,作者介绍了基础工具 Rprof 以及酷炫工具 lineprof 包,让我们知道自己的代码
的瓶颈所在。最后作者讲,R 语言需要更多 IT 人的推动,我实在不能同意更多。R 作为统
计学家写给统计学家的语言,总是会有些坑,需要专业人士来帮忙填补;另一方面,这帮
顽固的统计学家完全无视界面的重要性,看看 R 官方网站有多朴素就知道了,简直是土得
连渣都掉不下来,你跑去跟他反映,他只是一道冰冷眼神就可以杀死你。话说做网页前端
的 IT 人士你们在哪儿呢?
第二部分的两章介绍 R 的服务器应用,前面说了我是 Java 外行,所以不敢乱点评。只
记得那时候 Urbanek 大人一路上手舞足蹈给我解释 FastRWeb 的原理,然而我回去看到
varFastRWeb 这个目录的时候就已经暗自决定抛弃它了。我个人对那些需要 sudo 才能运
行且存放在非标准位置的程序有抵触心理,因为我下次一定会忘记怎么运行它以及配置文
件在什么位置。Rserve 和 FastRWeb 在它们被发明的年代里绝对都是划时代的,在服务器VI
端跑基于 R 的服务是很多码农的梦想,还记得那些年我们一起追的 Rweb 吗?如今回头看
看,还有多少人记得并用着 CGI ?可喜的是,张丹在第 5 章也介绍了 WebSocket 技术,这
也是一个相对较新、很有趣且有用的话题,建议读者好好研究。书中提到 websockets 包已
经被移出 CRAN,什么原因我也不知道,不过我基本上确定 httpuv 包可以取代它,也许是
websockets 的作者看到 httpuv 的工作之后决定不要重复劳动了。httpuv 包是 shiny 包的核心
技术之一,如今捣鼓 R 的服务器端应用,怎么能忽略 shiny ? shiny 比 RserveFastRWeb 出
现晚了近十年,为什么前者迅速流行起来,而后者尽管带着划时代的思想和技术,却被广
大用户忽略,极客们应该再次好好想想。有读者可能会说,切,shiny 是你们厂(RStudio)
的产品,你当然自卖自夸啦!是不是这样呢,我们且留给时间检验。
第三部分的两章就是数据库八仙过海各显神通了,我仅仅粗浅了解一点 MySQL,请
HadoopNoSQL 同行们不要笑出声。作为入门教程,这些章节都不错,从安装到“你好世
界”的例子都有介绍,十八般武艺入门之后的事情大家都知道,遇到问题搜索就是了。
极客不是一种身份,而是一种态度。在我眼里,这个词是中性的,极客不代表一个人
有多牛,而是他的钻研态度、好奇心以及对新技术的识别和接受能力。有些很牛很聪明的
人,未必能把聪明才智转化为生产力(请勿对号入座)。张丹这本书给大家提供了一条通向
R 的极客之路,但这绝对不是终点。技术人士容易沉迷于技术,就像科学研究人士迷信某
一种科学一样,唉,我就是这样浑身负能量。希望读者通过这本书能感受到作者探索的乐
趣,保持开放心态,积极学习,然后找到适合自己的极客理想(以及女朋友!相信我,后者
会让前者更快实现)。写序似乎应该说点鼓励的话吧,我没写过也不清楚贵圈的规矩,那么
就引用麦太的话好了:从前有一位小朋友他很努力学习,后来他发财了。
谢益辉
2014 年 6 月 23 日于 A 村
(吝啬的房东一直不给我修空调,已热哭,决定在最后这个黄金广告位狠狠黑她一把,叫她随便得罪码农!)Foreword?序 二
我有时会问自己会不会因为名字而买一本书?当我看到“ R 的极客理想”时,我就找
到了答案。把这个书名做个分词,去除停止词之后有三个词:“ R”、“极客”和“理想”。
这是耐人寻味的三个词。
R 是我现在谋生的工具,我对它有着十多年的感情。我亲历了 R 从和 GAUSS 进行比较
的时代走过和 SAS 进行比较的时代、来到了和 Python 及 Julia 这样的语言进行比较的时代,从最开始的无人问津到如今的炙手可热。R 的资料在互联网上可以说汗牛充栋,但是中文
书籍仍然很少。张丹是圈内著名的博主,明永玲是圈内著名的编辑,有幸被邀约写这篇序
言时,我对这个组合非常看好。
阅读内容之后,我发现这本书有太多和其他 R 语言书籍不一样的地方。传统的 R 语言
书籍大多是基于统计的思维展开的,通过介绍统计方法在 R 中的实现来学习 R,这就使得
很多统计出身的用户可以很容易地和其他统计软件进行类比,从而加速学习的过程。进入
大数据的时代后,R 作为数据处理的神器也越来越受关注,R 语言的书籍也开始以数据为中
心,从数据的获取、处理、分析一直到可重复研究和可视化展现,在应用层面进行全方位
的介绍。但是,作为一种编程语言,程序员视角的 R 书籍还是非常少的。张丹的这本书刚
好可以覆盖这部分的内容。
极客是 R 圈中比较少见的一种生物,尤其是来自极客之乡 IT 界的正宗极客。R 的最初
用户基本上都是统计圈的,但是最近几年 R 能够在国内越来越火,主要得益于 IT 界的贡
献。R 在欧美火的时间更早,但发展的趋势也大抵如此。从 R 的本性来说,它本不该是极
客关注的语言,因为其对外部功能延伸的追求远甚于对内部语言完美的追求,从 S 语言设
计之初就声明了人的时间远比计算机的时间宝贵,尤其是分析建模人员的时间。这种比较
乡愿的风格最初是不为极客所喜的。但是因为其极端易用,在惜时如金的产业界快速地流
行了起来,自然而然地产生了大量的难题。于是高贵冷艳、魅惑狂狷的极客们就参与进来
了。我认识的张丹,就是这样一位极客。VIII
R 是一个很奇怪的东西,没有编程基础的人可以很容易地入门,但是很难有信心觉得
自己成了高手。编程高手初学时常常是破口大骂,但是很快就中了 R 的迷毒。说到底,还
是因为 R 本质上是统计学家发明的语言,和模型打交道的能力比和计算机打交道的能力更
强大。虽然如此,随着 R 的扩展包越来越丰富,用户在享受便利性的同时也增加了理解上
的风险,函数背后的机制不再是黑箱,那么,R 中的 IT 高手的见解就变得非常重要。从他
们的视角来看 R、使用 R,无论是对于统计背景还是 IT 背景的用户都有很强的借鉴意义。
R 流的是实用主义的血,看上去和理想是背道而驰的。但 R 毕竟是没有灵魂的工具,它的性格应该取决于用它的人。在张丹的这本书里,我看到了理想的光辉。我看过不少书
也自己写书,感觉介绍知识是最简单的事,但是表明观点是最困难的。对于作者来说,观
点越不鲜明就越能避免犯错。但是对于读者来说,尤其是初学的读者,很容易陷入对自己
的怀疑中。而张丹的这本书会直接告诉读者应该怎样做,照着代码操作一遍就能解决问题。
虽然有些建议可能不是最好的解决方案,但至少是足够好的,在实际的应用中可以解决问
题。在这一点上,理想主义的作者和实用主义的 R 实现了完美的结合。
当然,整本书在“R”、“极客”、“理想”之间实现了更加完美的结合。
李舰
2014 年 8 月 1 日于上海Preface?前 言
为什么要写这本书
我是一名程序员,前后做了 10 年的程序开发工作。在这 10 年间,我从程序员一路做到
架构师,经历了太多的系统和应用。我做过手机游戏,写过编程工具;做过大型Web 应用系
统,写过公司内部 CRM;做 过 SOA 的系统集成,写过基于 Hadoop 的大数据工具;做过外包,做过电商,做过团购,做过支付,做过 SNS,也做过移动 SNS。以前只用 Java,然后开始用
PHP……如同其他程序员一样,我一度陶醉于追求各种技术的创新,但始终有一个问题困扰
着我,那就是如何才能够将我所掌握的技术转变成价值?这就好比我面对着一座金山,我拥
有先进的技术,可以制作各种性能稳定、功能卓越的挖掘机器,但我不懂如何将矿石提纯,变成金子!每每看到别人利用我的技术挖掘出金子时,我只能满脸的羡慕,心中无限的不甘。
直到遇见 R 语言,我豁然开朗。R 语言为我从另外一个角度开启了宝藏的大门,也让
我对自己的职业重新思考、规划,最后坚定了我向统计、金融行业的转型。如果你也存在
以上的问题,不如随着本书一起进入 R 语言的世界,领略 R 语言特有的魅力,通过对 R 语
言的学习,重新认识大数据的价值,更深一步地提升个人价值。
随着我与统计、金融领域的朋友交流地逐步深入,我深刻地体会到,他们对 R 语言的
实际使用也存在着很大的问题和困惑。比如,他们在某些实验室环境下,使用 R 语言可以
很轻松、很顺利地实现预期效果,但是移植到真实环境下,面对浩瀚繁复的大数据,在使
用 R 语言的过程中出现了很多问题。这就好比面对一座金山,他们掌握着先进的提纯技术,但他们所使用的挖掘、采集工具却还停留在石器时代!使用工具的落后,使他们要面对大
量 R 语言之外的问题,这让他们应接不暇,甚至崩溃!有的人甚至因此认为,R 语言只是
一种实验室语言,至少以现在的技术水平无法将它运用到现实生活中,R 语言在现实生活
中广泛应用,简直是天方夜谭!
是的,如果你是一名没有计算机背景的 R 语言使用者,你在实际使用中也同样会遇到X
许多这样或那样的问题,面对这些棘手的问题寝食难安,尝试着通过各种方式寻求解决方
案。其实,在计算机领域,这些问题已经早就有了成熟、有效的解决方案。
本书的内容来自我在 R 语言实际使用过程中的经验总结,基本都是我在工作中使用 R 语
言的真实记录,其中涉及计算机、互联网、数据库、大数据、统计、金融等领域,详细总
结了 R 语言在实际使用时与 Java、MySQL、Redis、MongoDB、Cassandra、Hadoop、Hive、HBase 等技术综合运用的解决方案,具有实战性,可操作性强。如果你与 R 语言接触时间不
长,本书可以让你看到 R 语言在各行业、各领域所散发的魅力;如果你在某行业使用 R 语言
已经有一段时间了,可能在使用 R 语言的过程中遇到了瓶颈,本书将让你看到 R 语言在与其
他计算机语言结合后所迸发的强大活力;如果你是技术人员,本书中有全局观的案例实施,也许会给你带来新的启发,甚至跟我一样,重新规划自己的职业生涯,找到学习、奋斗的新
方向;如果你是企业的中高层管理者,在本书中可以看到我们已经实现的技术成果,如果需
要,你甚至可以按照书中记录的详细操作步骤,直接在企业环境中实施,直接获利!
在此,我不得不强调,本书不是入门书,不讲 R 的语法,如果你想学习 R 语言的基础
语言入门知识,那么,你来错地方了。但是,如果你已经具备了一定的 R 语言基础,但不
一定具有计算机语言背景,我将告诉你 R 语言在真实环境下到底都能够做什么,并且详细
地告诉你怎样一步一步地实施。
在与各界R语言初学者的交流中,我发现,入门后,学习R语言最大的问题,在于如何使
用R语言的众多软件包,而介绍这方面的图书很难找到,只有一些网上流传的小册子。本书涉
及了30个R语言包,并结合我的使用心得及案例分析,相信会解决大家R语言入门后的困扰。
本书是“ R 的极客理想”系列图书的第一本,姊妹篇《 R 的极客理想—高级开发篇》
将深入介绍 R 语言底层原理,并使用 R 语言开发出企业级的应用。
本书的使用环境涉及 Linux Ubuntu 和 Windows 7 两种操作系统,R 语言包的 2.15.3 和
3.0.1 两个版本,在每一节中都有明确的标识。
R 语言还在不断地进步和更新,它将引导一场数据的革命,跨学科的结合是时代趋势,也是我们的机遇!
读者对象
本书适合以下 R 语言工作者:
计算机背景的软件工程师;
数据库背景的 DBA;
数据分析背景的数据科学家;
统计背景的科研工作者;
大专院校相关专业的学生。XI
如何阅读本书
本书的内容分为四个部分。
第一部分是 R 基础(第 1 ~ 3 章),介绍了为什么要学习 R 语言,R 语言不同版本的安
装,以及 R 语言中常用的 12 个软件包。帮助读者快速了解 R 语言的工具包、时间序列包和
性能监控包。
第二部分是 R 服务器 ( 第 4 ~ 5 章 ) ,介绍了 R 语言与其他编程语言的通信,以及 R
语言作为服务器的应用。帮助读者打通 R 语言与其他编程语言的通道,并实现 R 语言的服
务器应用。
第三部分是数据库和大数据 ( 第 6 ~ 7 章 ),介绍了 R 语言与各种数据库的通信,以及
R 语言与 Hadoop 集成。帮助读者打通 R 语言与各种数据库层的通道,并实现 R 语言对基
于 Hadoop 大数据的处理。
第四部分是附录,介绍了 Java、各种数据库以及 Hadoop 的安装方式。笔者希望读者可
以在不借助其他参考书的情况下,完成书中所有实例。
本书为工具书,每节之间没有特别的顺序要求,你可以选择任何你感兴趣的章节进行
阅读。如果你是一名初学者,想全面掌握 R 语言,请按顺序阅读全部的章节。
勘误和支持
由于笔者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地
方,恳请读者批评指正。为此,笔者创建一个在线的图书交流网站 ( https:onbook.me ),方便与读者进行沟通。如果读者在阅读过程中遇到问题,也可以在网站中留言,我将尽量
在线上为你提供最满意的解答。书中的全部源代码都可以从华章公司网站(www.hzbook.
com)或本书交流网站下载,我也会及时更新代码。本书为黑白印刷,关于更绚丽的彩色图
片,读者运行源代码即可看到。如果你有什么宝贵意见,欢迎发送邮件至 bsspirit@gmail.
com,期待能够得到你真挚的反馈。
致谢
感谢我的团队,林伟林、林伟平、邓一硕,让我们因 R 语言走到一起。感谢机械工业
出版社华章公司的编辑明永玲,帮助我审阅全部章节,引导我顺利完成书稿。感谢我的爸
爸、妈妈和爱人,感谢你们对我工作上的支持和生活上的照顾!
谨以此书献给我最亲爱的家人以及众多 R 语言爱好者们!
张丹
2014 年 5 月于中国北京目 录? Contents
序一
序二
前言
第一部分 R 基础
第 1 章 R 语言基础包 ········································································································ 2
1.1 R 是最值得学习的编程语言 ······················································································ 2
1.1.1 我的编程背景 ················································································································ 3
1.1.2 为什么我会选择 R ········································································································· 3
1.1.3 R 的应用前景 ················································································································ 7
1.1.4 时代赋予 R 的任务 ········································································································ 8
1.2 R 的历史版本安装 ····································································································· 8
1.2.1 R 在 Windows 中安装 ···································································································· 9
1.2.2 R 在 Linux Ubuntu 中安装 ·························································································· 10
1.2.3 R 的最新版本安装 ······································································································· 10
1.2.4 R 的指定版本安装 ······································································································· 10
1.3 fortunes 记录 R 语言的大智慧··················································································11
1.3.1 fortunes 介绍 ··············································································································· 12
1.3.2 fortunes 安装 ··············································································································· 12
1.3.3 fortunes 包的使用 ········································································································ 12
1.4 formatR 代码自动化排版 ························································································ 13XIII
1.4.1 formatR 介绍 ··············································································································· 13
1.4.2 formatR 安装 ··············································································································· 14
1.4.3 formatR 的使用 ··········································································································· 14
1.4.4 formatR 的源代码解析 ································································································ 20
1.4.5 源代码中的 Bug ·········································································································· 21
1.5 多人在线协作 R 开发 RStudio Server ······································································ 22
1.5.1 RStudio 和 RStudio Server ·························································································· 22
1.5.2 RStudio Server 安装 ···································································································· 22
1.5.3 RStudio Server 使用 ···································································································· 23
1.5.4 RStudio Server 多人协作 ····························································································· 26
1.6 R 和 JSON 的傻瓜式编程 ························································································ 29
1.6.1 rjson 包介绍 ················································································································ 29
1.6.2 RJSONIO 包介绍········································································································· 33
1.6.3 自定义 JSON 的实现 ··································································································· 36
1.6.4 JSON 性能比较 ··········································································································· 38
1.7 R 语言的高质量图形渲染库 Cairo ·········································································· 40
1.7.1 Cairo 介绍 ··················································································································· 40
1.7.2 Cairo 包安装 ················································································································ 40
1.7.3 Cairo 使用 ··················································································································· 41
1.8 caTools:一个奇特的工具集 ··················································································· 46
1.8.1 caTools 介绍 ················································································································ 47
1.8.2 caTools 安装 ················································································································ 48
1.8.3 caTools 使用 ················································································································ 48
第 2 章 时间序列基础包 ································································································· 58
2.1 R 语言时间序列基础库 zoo ····················································································· 58
2.1.1 zoo 包介绍 ··················································································································· 59
2.1.2 zoo 安装 ······················································································································ 60
2.1.3 zoo 包的使用 ··············································································································· 60
2.2 可扩展的时间序列 xts ····························································································· 75
2.2.1 xts 介绍 ······················································································································· 75
2.2.2 xts 包的安装 ················································································································ 78
2.2.3 xts 包的使用 ················································································································ 78XIV
2.3 时间序列可视化 plot.xts ·························································································· 93
2.3.1 xtsExtra 介绍 ··············································································································· 93
2.3.2 xtsExtra 安装 ··············································································································· 93
2.3.3 xtsExtra 包的使用········································································································ 94
第 3 章 R 性能监控包 ·····································································································104
3.1 R 语言本地缓存工具 memoise ···············································································104
3.1.1 memoise 介绍 ·············································································································105
3.1.2 memoise 安装 ·············································································································105
3.1.3 memoise 使用 ·············································································································105
3.1.4 memoise 函数源代码分析 ························································································106
3.2 R 语言性能监控工具 Rprof ····················································································108
3.2.1 Rprof 函数介绍 ········································································································109
3.2.2 Rprof 函数的定义 ····································································································109
3.2.3 Rprof 函数使用 : 股票数据分析案例 ·······································································109
3.2.4 Rprof 函数使用 : 数据下载案例 ··············································································112
3.2.5 用 profr 包可视化性能指标 ························································································113
3.2.6 Rprof 的命令行使用 ···································································································115
3.3 R 语言性能可视化工具 lineprof ·············································································116
3.3.1 lineprof 介绍 ···············································································································117
3.3.2 lineprof 安装 ···············································································································117
3.3.3 lineprof 使用 ···············································································································118
第二部分 R 服务器
第 4 章 R 语言的跨平台通信 ························································································122
4.1 Rserve 与 Java 的跨平台通信 ·················································································122
4.1.1 Rserve 安装 ················································································································123
4.1.2 用 Java 远程连接 Rserve ····························································································124
4.2 Rsession 让 Java 调用 R 更简单 ·············································································126
4.2.1 Rsession 下载 ·············································································································126
4.2.2 用 Eclipse 构建 Rsession 项目 ····················································································127XV
4.2.3 Rsession 的 API 介绍 ·································································································128
4.2.4 Rsession 使用 ·············································································································129
4.3 解惑 rJava R 与 Java 的高速通道 ···········································································132
4.3.1 rJava 介绍 ···················································································································133
4.3.2 rJava 安装 ···················································································································133
4.3.3 rJava 实现 R 调用 Java ·······························································································134
4.3.4 rJava(JRI) 实现 Java 调用 R (Windows 7) ··································································135
4.3.5 rJava(JRI) 实现 Java 调用 R (Ubuntu) ········································································137
4.4 Node.js 与 R 跨平台通信 ························································································137
4.4.1 Node.js 简单介绍········································································································138
4.4.2 R 语言配置环境 ·········································································································138
4.4.3 Node.js 配置环境········································································································139
4.4.4 Node.js 与 R 跨平台通信 ····························································································139
第 5 章 R 的服务器实现 ·································································································143
5.1 R 语言服务器程序 Rserve 详解 ··············································································143
5.1.1 Rserve 的启动 ············································································································144
5.1.2 Rserve 高级使用:Rserve 配置管理 ···········································································146
5.1.3 Rserve 高级使用:用户登录认证 ···············································································148
5.2 Rserve 的 R 语言客户端 RSclient ···········································································149
5.2.1 配置 Rserve 服务器 ····································································································150
5.2.2 RSclient 安装 ··············································································································150
5.2.3 RSclient 的 API ··········································································································151
5.2.4 RSclient 的使用 ··········································································································152
5.2.5 两个客户端同时访问 ··································································································152
5.3 FastRWeb:跑在 Web 上的 R 程序 ·········································································153
5.3.1 FastRWeb 介绍 ···········································································································154
5.3.2 FastRWeb 安装 ···········································································································155
5.3.3 FastRWeb 使用 ···········································································································156
5.4 R 语言构建 Websocket 服务器 ···············································································159
5.4.1 websockets 介绍 ·········································································································159
5.4.2 websockets 安装 ·········································································································160
5.4.3 快速启动 websockets 服务器 demo ············································································162XVI
5.4.4 R 语言创建 Websocket 服务器实例 ············································································163
5.4.5 R 语言创建 Websocket 客户端连接 ············································································163
5.4.6 用浏览器 HTML5 原生 API 客户端连接 ····································································164
第三部分 数据库和大数据
第 6 章 数据库和 NoSQL ······························································································168
6.1 RMySQL 数据库编程指南 ·····················································································168
6.1.1 RMySQL 在 Linux 下安装··························································································169
6.1.2 RMySQL 在 Windows 7 下安装 ·················································································173
6.1.3 RMySQL 函数使用 ····································································································176
6.1.4 RMySQL 案例实践 ····································································································181
6.2 R 利剑 NoSQL 之 MongoDB ··················································································183
6.2.1 MongoDB 环境准备 ·························································································183
6.2.2 rmongodb 函数库 ·······································································································185
6.2.3 rmongodb 基本使用操作 ····························································································187
6.2.4 rmongodb 性能测试的案例·························································································189
6.3 R 利剑 NoSQL 之 Redis ·························································································192
6.3.1 Redis 环境准备 ···········································································································192
6.3.2 rredis 函数库 ··············································································································193
6.3.3 rredis 基本使用操作 ···································································································194
6.3.4 rredis 测试案例 ···········································································································198
6.4 R 利剑 NoSQL 之 Cassandra ··················································································200
6.4.1 Cassandra 环境准备 ····································································································200
6.4.2 RCassandra 函数库 ·····································································································201
6.4.3 RCassandra 基本使用操作 ··························································································202
6.4.4 RCassandra 使用案例 ·································································································204
6.4.5 Cassandra 的没落 ·······································································································205
6.5 R 利剑 NoSQL 之 Hive ···························································································206
6.5.1 Hive 环境准备 ············································································································207
6.5.2 RHive 安装 ·················································································································208
6.5.3 RHive 函数库 ·············································································································209XVII
6.5.4 RHive 基本使用操作 ··································································································209
6.6 用 RHive 从历史数据中提取逆回购信息 ·······························································212
6.6.1 逆回购简介 ·················································································································212
6.6.2 历史数据存储结构 ·····································································································213
6.6.3 通过用 RHive 提取数据 ·····························································································213
6.6.4 策略模型及实现 ·········································································································216
第 7 章 RHadoop ························································································································222
7.1 R 语言为 Hadoop 注入统计血脉 ·····················································································222
7.1.1 Hadoop 介绍 ···············································································································223
7.1.2 为什么要让 Hadoop 结合 R 语言 ···············································································224
7.1.3 如何让 Hadoop 结合 R 语言 ·······················································································225
7.1.4 展望未来 ····················································································································226
7.2 RHadoop 安装与使用 ·····························································································226
7.2.1 环境准备 ····················································································································227
7.2.2 RHadoop 安装 ············································································································227
7.2.3 RHadoop 程序开发 ·····································································································229
7.3 RHadoop 实验:统计邮箱出现次数 ·······································································233
7.3.1 需求描述 ····················································································································233
7.3.2 算法实现 ····················································································································234
7.4 RHadoop 实现基于 MapReduce 的协同过滤算法 ···················································236
7.4.1 基于物品推荐的协同过滤算法介绍 ···········································································236
7.4.2 R 语言本地程序实现 ··································································································237
7.4.3 R 基于 Hadoop 分步式程序实现 ················································································242
7.5 rhbase 安装与使用 ··································································································249
7.5.1 HBase 环境准备 ·········································································································250
7.5.2 rhbase 安装 ·················································································································250
7.5.3 rhbase 函数库 ·············································································································251
7.6 解决 RHadoop 安装错误:PipeMapRed.waitOutputThreads ································253
7.6.1 rmr2 运行错误日志 ····································································································254
7.6.2 定位错误到 Hadoop 日志 ···························································································255
7.6.3 从 Hadoop 入手找解决办法 — 失败 ··········································································256
7.6.4 从 RHadoop 入手找解决办法 — 成功 ········································································257XVIII
第四部分 附 录
附录 A Java 环境安装 ···································································································262
附录 B MySQL 数据库安装 ··························································································266
附录 C Redis 数据库安装 ······························································································270
附录 D MongoDB 数据库安装 ·····················································································273
附录 E Cassandra 数据库安装 ·····················································································277
附录 F Hadoop 安装 ······································································································280
附录 G Hive 环境安装 ···································································································287
附录 H HBase 安装 ········································································································290第一部分
R 基础
■
第1章 R语言基础包
■
第2章 时间序列基础包
■
第3章 R性能监控包
Part 1第 1 章
R 语言基础包
本章主要介绍了为什么要学习 R 语言,R 语言软件的安装,R 语言的开发工具,以及 R
语言中常用的几个软件包,以帮助读者快速了解 R 语言的工具包,激发读者对 R 语言的学
习兴趣。
1.1 R 是最值得学习的编程语言
问题
为什么要学 R 语言?
Chapter 1第 1 章 R 语言基础包 3
引言
如果要问在 Node、Lua、Python、Ruby 和 R 这 5 种语言中,哪个语言在 2014 年的应
用前景会更好,我会毫不犹豫地选择 R,而且我认为 R 语言不仅是 2014 年,也是以后更长
一段时间内的明星。在本书开篇,我们就谈谈为什么 R 语言是最值得学习的编程语言。
1.1.1 我的编程背景
本人是程序员、架构师,从编程入门到今天,一直深信着 Java 是改变世界的语言,Java 已经做到了,而且一直很辉煌。但当 Java 越来越强大,覆盖领域越来越多,变得无所
不能的时候,它反而不够专业,这就给了其他语言发展的机会。
我已使用 Java 语言 11 年,R 语言 3 年,Node 1 年,对于这个问题 “哪个语言在 2014
年的应用前景会更好”,我选择 R 语言。
1.1.2 为什么我会选择 R
从下面的 9 个方面来说明我选择 R 的原因。
R 的基因
R 的发展
R 的社区和资源
R 的哲学
R 的使用者
R 的语法
R 的思维模式
R 解决的问题
R 的不足
1. R 的基因
1992 年,新西兰奥克兰大学的 Ross Ihaka 和 Robert Gentleman 两位统计学家,为了方
便教授初等统计课程,发明了一种编程语言,因为他们名字的首字母都是 R,于是 R 便成
为这门语言的名称。
从开始学习 R 语言,我就开始了知识的跨界思考。统计学基于概率论,概率论又基于
数学,用计算机的方式编程,同时解决某个领域的实际问题。多种学科知识的交集,决定
着我们解决问题的能力。统计的基因,让 R 语言与众不同!第一部分 R 基础 4
2. R 的发展
R 一直在小众领域成长着,最早也只有统计学家在用,主要用来代替 SAS 做统计计算。
然而时代在进步,随着大数据的爆发,R 终于在这一波浪潮中被工业界所发现。然后,越
来越多有工程背景的人加入到这个圈子,对 R 的计算引擎、性能以及各种程序包进行改进
和升级,让 R 获得了新生。
我们现在用到的 R 语言软件,已经越来越接近工业软件的标准了。由工程师推动的 R
的发展,其速度远远地超过了由统计学家推动的发展。随着人们对数据分析需求的进一步
增加,R 会以更快的速度继续发展,将成为免费的、开源的数据分析软件的代名词。
3. R 的社区和资源
R 的发展离不开 R 的各种社区支持,尤其是 R 的官方社区支持。在 R 的官方网站中,我
们可以下载到 R 语言软件、R 的第三方软件包和 R 的其他支持软件。当然,我不得不承认 R
的官方网站 ( http:www.r-project.org ) 从 Web 页上看起来太简陋了,稍微调整一下CSS 样
式表,都会比现在好看很多。也许这种简单、无修饰也是统计学家的基因吧。R 语言的社区
资源同其他语言一样丰富,除了官方社区,还有开发者论坛( http:r.789695.n4.nabble.com )、R-Journal 列表 ( http:journal.r-project.org )、软件包列表、R 语言图书列表以及 R 用户组等。
R 是自由软件,因此开发者可以开发自己的软件包,封装自己的功能,然后在 CRAN
(http:cran.rstudio.com) 上面发布。截止到 2014 年 2 月,共有 5236 个 R 包在 CRAN 上
面发布。可能很多人会说只有 5236 个包,数量太少了。这是因为 CRAN 是需要提交申请
的,每个包都必须经过 R 语言小组审核、检查后才会发布出来,而且审核非常严格。高质
量是发布一个新的 R 包的基本要求。由于 CRAN 过于严格的审查,让很多开发者选择在
RForge( https:r-forge.r-project.org ) 上发布 R 包,还有些 R 包是基于 Github 发布的,我也
在 Github 上面发布了自己的 R 包:https:github.combsspiritchinaWeather 。
下面列出与 R 语言相关的主要社区和资源。
R 官方网站:http:www.r-project.org
R 开发者论坛:http:r.789695.n4.nabble.com
CRAN:http:cran.rstudio.com
RForge:https:r-forge.r-project.org
R 新闻和博客:http:www.r-bloggers.com
统计之都:http:cos.name
4. R 的哲学
每种语言都有自己的设计理念和哲学,而我体会的 R 的哲学就是“静下心做事情”。R第 1 章 R 语言基础包 5
不需要很长的代码,也不需要设计模式。一个函数调用,传几个参数,就能实现一个复杂
的统计模型。我们需要思考的是用什么模型、传什么参数,而不是怎么进行程序设计。我
们可能会用 R 实现“从一个数学公式,变成一个统计模型”的过程,我们也可能会考虑“如
何让一个分类器结果更准确”,但我们不必思考一个算法的“时间复杂度是多少,空间复杂
度是多少”。
R 的哲学,可以让你把数学和统计学的知识,变成计算模型,这也是 R 的基因所决定的。
5. R 的使用者
R 语言早期主要是学术界统计学家在用,后来逐渐被其他很多领域的学者所用。R 语言
有各种不同的应用领域,包括统计分析、应用数学、计量经济、金融分析、财经分析、人
文科学、数据挖掘、人工智能、生物信息学、生物制药、全球地理科学、数据可视化等。
近几年,由互联网引发的大数据革命让工业界的人开始认识 R,加入 R。当越来越多的
有工程背景的人加入到 R 语言使用者的队伍后,R 才开始向着全领域发展,逐步实现工业
化的要求。现在,R 已不仅仅是学术界的语言,它还是工业界必备的语言。
下面列出一些推动 R 语言在工业界发展的 R 包。
RevolutionAnalytics 公司的 RHadoop 产品,让 R 可以直接调用 Hadoop 集群资源。
RStudio 公司的 RStudio 产品,给了我们对编辑软件新的认识。
RMySQL、ROracle、RJDBC 打通了 R 和数据库之间的访问通道。
rmongodb、rredis、RHive、rHBase、RCassandra 打通了 R 和 NoSQL 数据库之间的
访问通道。
Rmpi、snow 打通了单机多核并行计算的通道。
Rserve、rwebsocket 打通了 R 语言的跨平台通信的通道。
6. R 的语法
R 是面向对象语言,语法如同 Python。但 R 的语法很自由,很多函数的名字看起来都
是那么随意,这也是 R 的哲学的一部分吧!例如,看到如下这样的赋值语法,有其他语言
基础的程序员,肯定会崩溃的。
> a<-c(1,2,3,4)->b
> a
[1] 1 2 3 4
> b
[1] 1 2 3 4
随机取正态分布 N(0,1) 的 10 个数,又是这么的简单。第一部分 R 基础 6
> rnorm(10)
[1] -0.694541401 1.877780959 -0.178608091 0.004362026
[5] 0.836891967 1.794961298 0.115284187 0.155175219
[9] 0.464028612 -0.842569561
用 R 画鸢尾花的数据集的散点图,有非常好的可视化效果。
> data(iris) 加载数据集
> head(iris) 查看前6行数据集
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> plot(iris) 画图
输出结果见图 1-1。
图 1-1 鸢尾花的数据集的散点图
正是因为 R 自由的哲学,让 R 的语法独特而简洁,我已经喜欢上这种哲学了。第 1 章 R 语言基础包 7
7. R 的思维模式
R 语言让我跳出了原有的思维定式。使用 R 语言,我们应该像统计学家那样思考问题,而不是拘泥于程序员的思维模式。统计学家的思维模式,是先考虑为什么,再考虑做什么。
而程序员的思维模式,是直接考虑怎么做,等有了结果再考虑为什么。
R 语言是直接面向数据的语言。在我们的日常生活中,无论做什么事情都会产生数据,上网有浏览数据,买东西有消费数据,就算什么都不干,也会受大气 PM2.5 的影响,有空
气污染指数数据。利用 R 语言,我可以直接分析这些数据。面向什么业务,就分析什么数
据,不需要从产品经理向程序员的角色转换,不需要考虑有什么功能,更不需要考虑程序
设计的事。跳出程序员的思维模式,我们所能认知的东西会更多,于是也能找到更适合自
己的定位。
8. R 解决的问题
当数据成为生产资料的时候,R 就是为人们能运用生产资料创造价值的生产工具,R 语
言主要解决的是数据的问题。整个人类文明所获得的全部数据中,有 90% 以上是自互联网
诞生以来产生的;当 Hadoop 帮助人们解决了大数据存储的问题后,如何发现数据的价值,则成为当前最火的话题。R 语言具有强大的统计分析能力,这就让它成为数据分析最好的
工具。所以,R 要解决的问题,就是如何挖掘数据价值的问题。
9. R 的不足
尽管前面说了 R 的各种优点,但我们依然不能说 R 就是完美无缺的,因为 R 也有很多
不足。具体来说,R 的缺点有下面 5 个。
R 软件是统计学家编写的,并不如软件工程师编写的软件那么健壮。
R 软件的性能,存在一些问题。
R 语言很自由,语法命名不太规范,需要花时间熟悉。
R 语言的内核编程,要比普通的 R 包使用,难度大得多。
R 语言结合了很多数学、概率、统计的基础知识,学起来有一定门槛。
R 的这些不足,都是可以克服的。当有更多有工程背景的人加入的时候,R 语言会比现
在更强大,会帮助使用者创造更多的价值。
1.1.3 R 的应用前景
R 可以做所有 SAS 能做的事情。SAS 系统全称为 Statistics Analysis System,是国际上
最知名的商业分析软件工具之一。SAS 用于决策支持的大型集成信息系统,其重要组成部
分和核心功能是统计分析功能。在数据处理和统计分析领域,SAS 系统被誉为国际上的标第一部分 R 基础 8
准软件系统,堪称统计软件界的巨无霸。
R 和 SAS 处于完全的竞争的关系中,R 的免费和开放,让 R 有着更广阔的应用前景。
下面给出当今 R 应用最热门的领域。
统计分析:统计分布、假设检验、统计建模。
金融分析:量化策略、投资组合、风险控制、时间序列、波动率。
数据挖掘:数据挖掘算法、数据建模、机器学习。
互联网:推荐系统、消费预测、社交网络。
生物信息学:DNA 分析、物种分析。
生物制药:生存分析、制药过程管理。
全球地理科学:天气、气候、遥感数据。
数据可视化:静态图、可交互的动态图、社交图、地图、热图、与各种 JavaScript 库
的集成。
本书会介绍 R 语言在统计分析、金融分析、数据挖掘、推荐系统、社交网络等领域的
应用。R 有着非常广阔的应用前景,而且 R 也将成为新一代的最有能力创造价值的工具。
1.1.4 时代赋予 R 的任务
R 语言是在大数据时代被工业界了解和认识的语言,R 语言被时代赋予了挖掘数据价
值、发现数据规律以及创造数据财富的任务。R 语言也是帮助人们发挥智慧和创造力的最
好的生产工具,因此我们不仅要学好 R 语言,还要用好 R 语言,为社会注入更多的创新
的生产力。
总而言之,在这 5 种语言中,R 是最特殊的,R 被赋予了与其他语言不同的使命。R 的
基因决定了 R 将成为 2014 年,也可能是以后更长一段时间的明星。因此我认为“ R 是最值
得学习的编程语言”。不论你正在读书,还是已经工作,掌握 R 语言这个工具并找最适合自
己的位置将会前途无量。
1.2 R 的历史版本安装
问题
在 Linux Ubuntu 上,如何安装不同版本的 R ?第 1 章 R 语言基础包 9
引言
R 语言已进入到了 3.0 的时代,但有些第三方的 R 包还处于 2.15 的状态,没有升级,如 RHadoop 等。我们要用这些 R 包的时候,就需要指定版本的 R 软件。对于 Windows 来
说,这是很简单的操作,只要安装不同的 (.exe) 文件就行了;对于 Linux 系统来说,就不那
么容易了,需要我们手动进行配置。不熟悉 Linux 系统的同学,在这里就很容易卡住。所
以,本节就讲一下如何在 Linux Ubuntu 系统中安装 R 语言软件包的指定版本。
1.2.1 R 在 Windows 中安装
通过 R 的官方网站 ( http:cran.r-project.org ) ,我们可以下载 Linux、MacOS、Windows 系统的 R 语言安装包。R 在 Windows 系统中安装非常简单,下载可执行文件
(.exe),双击即可进行安装。安装后就能运行 R 语言的界面,如图 1-2 所示。
图1-2 R在Windows系统中的安装界面第一部分 R 基础 10
1.2.2 R 在 Linux Ubuntu 中安装
本书使用的 Linux 是 Ubuntu 12.04.2 LTS 64bit 的系统,安装 R 语言软件包可以通过
Ubuntu 的 apt-get 工具进行安装。下面就介绍在 Linux Ubuntu 中安装 R 语言的过程。
~ R 检查R 是否已安装
The program 'R' is currently not installed. You can install it by typing:
sudo apt-get install r-base-core
~ sudo apt-get install r-base-core 根据提示安装R 语言软件包
~ R --version 检查R 的版本
R version 2.14.1 (2011-12-22)
Copyright (C) 2011 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)
前面的检查结果表明,我们安装的是 R 的默认版本,即 2.14.1 版,这与本书中 R 的版
本是不符的,接下来我们希望安装最新版本 R 的软件包。
1.2.3 R 的最新版本安装
首先,删除 Linux Ubuntu 系统中原有的 R 软件包,代码如下:
~ sudo apt-get autoremove r-base-core 删除系统中原有的R软件包
接下来,找到一个 Ubuntu 的软件源镜像(http:mirror.bjtu.edu.cncranbinlinuxubuntu ),Linux Ubuntu 12.04 对应的名字是 precise,进入到 precise 目录,找到 r-base-core 相关的文
件,发现有多个 R 的版本。把这个软件源,增加到 apt 的 sources.list 文件中,代码如下:
~ sudo sh -c echo deb http:mirror.bjtu.edu.cncranbinlinuxubuntu
precise >>etcaptsources.list 在sources.list 文件最下面,新加一行
~ sudo apt-get update 更新源
~ sudo apt-get install r-base-core 再次安装R 语言软件包
~ R –version 检查R 的版本
R version 3.0.3 (2014-03-06) -- Warm Puppy
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
这时我们就安装了最新的 R 语言版本—3.0.3 版。
1.2.4 R 的指定版本安装
由于本书中的例子,大部分是基于 3.0.1 完成的,而 RHadoop 的例子是基于 2.15.3 完第 1 章 R 语言基础包 11
成的,因此我们还需要指定 R 的安装版本。
1. 安装 R 的 2.15.3 版本
~ sudo apt-get autoremove r-base-core 删除系统中原有的R软件包
~ sudo apt-get install r-base-core=2.15.3-1precise0precise1 安装R的2.15.3 版本
~ R –version 检查R语言软件包版本
R version 2.15.3 (2013-03-01) -- Security Blanket
Copyright (C) 2013 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)
2. 安装 R 的 3.0.1 版本
~ sudo apt-get autoremove r-base-core 删除系统中原有的R软件包
~ sudo apt-get install r-base-core=3.0.1-6precise0 安装R的3.0.1版本
~ R –version 检查R语言软件包版本
R version 3.0.1 (2013-05-16) -- Good Sport
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
这样我们就可以很方便地指定安装不同版本的 R 的语言软件包,满足不同的应用需求!
1.3 fortunes 记录 R 语言的大智慧
问题
如何才能更深入地了解 R, 它的起源、成长、经历是怎样的?第一部分 R 基础 12
引言
R 语言是在大数据“火”起来后,映入人们眼球的。但 R 语言的社区已经存在很多年,我们并不知道,R 语言在很长的历史时期,有着什么样的智慧。不过,正有人悄悄地记录
着 R 语言的大智慧。
1.3.1 fortunes 介绍
fortunes 库是一个 R 语言的语录集,截至 2013 年 12 月 14 日,一共总结了 360 条
R-help 的留言。这些都是 R 语言智慧的精华,让 R 语言的后辈使用者,可以更了解 R 语言
的本身,了解 R 的精神。
1.3.2 fortunes 安装
本节使用的系统环境是:
Linux: Ubuntu 12.04.2 LTS 64bit
R: 3.0.1 x86_64-pc-linux-gnu
注 fortunes 同时支持 Windows 7 环境和 Linux 环境。
Fortunes 的安装过程如下。
~ R 启动R 程序
> install.packages(fortunes) 安装fortunes 包
> library(fortunes) 加载fortunes 包
> ?fortunes 查看帮助
1.3.3 fortunes 包的使用
fortunes 包的使用非常简单,只有一个函数 fortune。
> fortune 随机查看一条语录
Barry Rowlingson: Your grid above has 86 = 42 points.
(That was a subtle Hitchhikers Guide To The Galaxy reference there, honest, and
not a stupid dumb multiplication mistake on my part after working four 18-hour
days on the trot...)
Peter Dalgaard: [...] Don't panic, just throw yourself at the ground and miss.-- Barry Rowlingson and Peter Dalgaard
R-help (March 2004)
> fortune(108) 指定查看一条语录
Actually, I see it as part of my job to in?ict R on people who are perfectly
happy to have never heard of it. Happiness doesn't equal pro?cient and第 1 章 R 语言基础包 13
ef?cient. In some cases the pro?ciency of a person serves a greater good than
their momentary happiness.-- Patrick Burns
R-help (April 2005)
完整的语录下载地址是 http:cran.r-project.orgwebpackagesfortunesvignettesfortunes.
pdf。静下心来阅读这些智慧精华就能更了解 R 语言本身。想用好一门语言,就需要更深入
地了解它。
1.4 formatR 代码自动化排版
问题
如何写出让别人看得懂,且符合规范的代码呢?
引言
新手写的代码,大都不注重代码规范,以为实现功能就算完成了。这种代码不仅别人
不愿意读,过几个月后再看自己都会觉得很烂。不仅仅新手如此,大多数程序员写的代码
都没有考虑如何让别人看着更方便。程序员最痛苦的事情,不是每天加班写程序,而是每
天加班读懂别人写的程序。最后,有人实在忍受不了其他人的丑陋代码,便开始制定代码
编程规范,又有人去实现代码的自动化排版工具。formatR 就是这样的一个 R 语言自动化排
版的工具。
1.4.1 formatR 介绍
formatR 包是一个实用的包,提供了 R 代码格式化功能,可以自动设置空格、缩进、换第一部分 R 基础 14
行等代码格式,让代码看起来更友好。formatR 包中的 API 中主要有下面 5 个函数。
tidy.source: 对代码进行格式化
tidy.eval: 输出格式化后的 R 代码和运行结果
usage: 格式化函数定义,并按指定宽度输出
tidy.gui: 一个 GUI 工具,支持编辑并格式化 R 代码
tidy.dir: 对某个目录下,所有 R 脚本进行格式化
1.4.2 formatR 安装
本节使用的系统环境是:
Win7 64bit
R: 3.0.1 x86_64-w64-mingw32x64 b4bit
注 formatR 同时支持 Windows 7 环境和 Linux 环境。
formatR 的安装过程如下:
~ R 启动R 程序
> install.packages(formatR) 安装formatR 包
library(formatR) formatR 加载
1.4.3 formatR 的使用
1. 字符串格式化
tidy.source 函数,以字符串作为输入参数,对代码格式化。
> tidy.source(text = c({if(TRUE)1 else 2; if(FALSE){1+1, comments, } else 2}))
{
if (TRUE)
1 else 2
if (FALSE) {
1 + 1
comments
} else 2
}
通过执行 tidy.source 函数,把代码进行了重新格式化,让我们一眼就可以看得懂。
2. 文件格式化
messy.R 是一个不太规范的 R 程序文件。我们读入这个文件,然后通过 tidy.source 函
数,以文件对象作为输入参数,进行代码格式化。第 1 章 R 语言基础包 15
> messy = system.?le(format, messy.R, package = formatR)
> messy
[1] C:Program FilesRR-3.0.1libraryformatRformatmessy.R
messy.R 的原始代码输出:
> src = readLines(messy)
> cat(src,sep=\n)
a single line of comments is preserved
1+1
if(TRUE){
x=1 inline comments
}else{
x=2;print('Oh no... ask the right bracket to go away!')}
13 one space before this comment will become two!
2+2+2 'short comments'
lm(y~x1+x2, data=data.frame(y=rnorm(100),x1=rnorm(100),x2=rnorm(100)))
only'single quotes' are allowed in comments
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 comments after a long line
'a character string with \t in it'
here is a long long long long long long long long long long long long long
long long long long long long long comment
格式化后的代码输出:
> tidy.source(messy)
a single line of comments is preserved
1 + 1
if (TRUE) {
x = 1 inline comments
} else {
x = 2
print(Oh no... ask the right bracket to go away!)
}
1 3 one space before this comment will become two!
2 + 2 + 2 'short comments'
lm(y ~ x1 + x2, data = data.frame(y = rnorm(100), x1 = rnorm(100), x2 =
rnorm(100))) only 'single quotes' are allowed in comments
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +
1 + 1 + 1 comments after a long line
a character string with \t in it
here is a long long long long long long long long long long long long long第一部分 R 基础 16
long long long
long long long long comment
可以看出,格式化后的输出,经过了空格、缩进、换行、注释等处理,代码可读性就
增强了。
3. 格式化并输出 R 脚本文件
新建 R 脚本文件 demo.r。
~ vi demo.r
a<-1+1;a;matrix(rnorm(10),5);
if(a>2) { b=c('11',832);a>2;} else print('a is invalid!!')
格式化 demo.r。
> x = demo.r
> tidy.source(x)
a <- 1 + 1
a
matrix(rnorm(10), 5)
if (a > 2) {
b = c(11, 832)
a>2
} else print(a is invalid!!)
输出格式化结果到文件 demo2.r,如图 1-3 所示。
> f=demo2.r
> tidy.source(x, keep.blank.line = TRUE, ?le = f)
> ?le.show(f)
图 1-3 输出格式化结果到文件
4. 输出格式化代码和运行结果
使用 tidy.eval 函数,以字符串形式,执行 R 脚本:第 1 章 R 语言基础包 17
> tidy.eval(text = c(a<-1+1;a, matrix(rnorm(10),5)))
a <- 1 + 1
a
[1] 2
matrix(rnorm(10), 5)
[,1] [,2]
[1,] 0.65050729 0.1725221
[2,] 0.05174598 0.3434398
[3,] -0.91056310 0.1138733
[4,] 0.18131010 -0.7286614
[5,] 0.40811952 1.8288346
这样直接在当前的运行环境中,就输出了代码和运行结果。
5. 格式化函数定义
通过 usage 函数可以只打印出函数定义,跳过函数细节。以 var 函数为例,输入
var,默认会打印出一个函数细节。
> var
function (x, y = NULL, na.rm = FALSE, use)
{
if (missing(use))
use <- if (na.rm)
na.or.complete
else everything
na.method <- pmatch(use, c(all.obs, complete.obs, pairwise.complete.obs,everything, na.or.complete))
if (is.na(na.method))
stop(invalid 'use' argument)
if (is.data.frame(x))
x <- as.matrix(x)
else stopifnot(is.atomic(x))
if (is.data.frame(y))
y <- as.matrix(y)
else stopifnot(is.atomic(y))
.Call(C_cov, x, y, na.method, FALSE)
}
> usage(var) 通过usage,只打印函数定义
var(x, y = NULL, na.rm = FALSE, use)
有时候函数定义也很长,比如 lm 函数,通过 usage 的 width 参数可以控制函数的显
示宽度。第一部分 R 基础 18
> usage(lm)
lm(formula, data, subset, weights, na.action, method = qr, model = TRUE, x =
FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...)
> usage(lm,width=30) usage 的width参数,控制函数的显示宽度
lm(formula, data, subset, weights,na.action, method = qr, model = TRUE,x = FALSE, y = FALSE, qr = TRUE,singular.ok = TRUE, contrasts = NULL,offset, ...)
6. GUI 工具
tidy.gui 函数是一个 GUI 的工具,可以在界面上编辑并格式化 R 代码。首先安装
gWidgetsRGtk2 库:
> install.packages(gWidgetsRGtk2)
also installing the dependencies 'RGtk2', 'gWidgets'
打开 GUI 控制台:
> library(gWidgetsRGtk2)
> g = tidy.gui
我们输入一段不太好看的代码,如图 1-4 所示。
图 1-4 tidy的GUI
点击“转换”,结果如图 1-5 所示,可以看到,在 GUI 的编辑器中,R 语言的代码被格
式化了!第 1 章 R 语言基础包 19
图1-5 格式化后的代码
7. 格式化目录中的文件
tidy.dir 函数可以批量格式化文件,对目录中的所有文件进行格式化操作。下面新建
目录 :dir,并在目录 dir 中新建两个 R 脚本文件:dir.r, dir2.r。
~ mkdir dir 新建目录 dir
~ cd dir
~ vi dir.r 用vi新建文件dir.r
a<-1+1;a;matrix(rnorm(10),5);
~ vi dir2.r
if(a>2) { b=c('11',832);a>2;} else print('a is invalid!!')
执行 tidy.dir:
> tidy.dir(path=dir)
tidying dirdir.r
tidying dirdir2.r
分别查看 dir.r 和 dir2.r:
~ vi dir.r
a <- 1 + 1
a
matrix(rnorm(10), 5)
~ vi dir2.r
if (a > 2) {
b = c(11, 832)
a>2
} else print(a is invalid!!)第一部分 R 基础 20
我们发现不规则的代码,已经被格式化了!
1.4.4 formatR 的源代码解析
通过上面的使用,我们不难发现,formatR 包的核心函数就是 tidy.source 函数,从
Github 上面找到源代码:https:github.comyihuiformatRblobmasterRtidy.R。我将在代码
中增加注释:
tidy.source = function(
source = 'clipboard', keep.comment = getOption('keep.comment', TRUE),keep.blank.line = getOption('keep.blank.line', TRUE),replace.assign = getOption('replace.assign', FALSE),left.brace.newline = getOption('left.brace.newline', FALSE),reindent.spaces = getOption('reindent.spaces', 4),output = TRUE, text = NULL,width.cutoff = getOption('width'), ...) {
if (is.null(text)) { 判断输入来源为剪贴板
if (source == 'clipboard' Sys.info['sysname'] == 'Darwin') {
source = pipe('pbpaste')
}
} else { 判断输入来源为字符串
source = textConnection(text); on.exit(close(source))
}
text = readLines(source, warn = FALSE) 按行读取来源数据
if (length(text) == 0L || all(grepl('^\\s', text))) { 文件行数判断
if (output) cat('\n', ...)
return(list(text.tidy = text, text.mask = text))
}
if (keep.blank.line R3) { 空行处理
one = paste(text, collapse = '\n') record how many line breaks beforeafter
n1 = attr(regexpr('^\n', one), 'match.length')
n2 = attr(regexpr('\n', one), 'match.length')
}
if (keep.comment) text = mask_comments(text, width.cutoff, keep.blank.line)
注释处理
text.mask = tidy_block(text, width.cutoff, replace.assign length(grep('=', text)))
把输入的R 代码,先转成表达式,再转回字符串。用来实现对每个语句的截取
text.tidy = if (keep.comment) unmask.source(text.mask) else text.mask
对注释排版
text.tidy = reindent_lines(text.tidy, reindent.spaces) 重新定位缩进第 1 章 R 语言基础包 21
if (left.brace.newline) text.tidy = move_leftbrace(text.tidy) 扩号换行
if (keep.blank.line R3) text.tidy = c(rep('', n1), text.tidy, rep('', n2))
增加首尾空行
if (output) cat(paste(text.tidy, collapse = '\n'), '\n', ...)
在console 打印格式化后的结果
invisible(list(text.tidy = text.tidy, text.mask = text.mask))
返回,但不打印结果
}
1.4.5 源代码中的 Bug
在读源代码的过程中,我发现有一个小问题,即在 R 3.0.1 版本,没有对向右赋值操作
(->) 进行处理。我已经就这个问题给作者提 Bug 了,参见 https:github.comyihuiformatR
issues31。Bug 测试代码如下 :
> c('11',832)->x2
> x2
[1] 11 832
> tidy.source(text=c('11',832)->x2) 格式化代码
c(11, 832) <- x2
> tidy.eval(text=c('11',832)->x2)
c(11, 832) <- x2
Error in eval(expr, envir, enclos) : object 'x2' not found
Bug 已修复。作者回复:“这个问题已经在 R 3.0.2 中修正了。”
> formatR::tidy.source(text=c('11',832)->x2) 格式化代码
x2 <- c(11, 832)
> sessionInfo
R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] formatR_0.10.3第一部分 R 基础 22
formatR 包提供的功能非常实用,特别是读别人写的不规范的代码的时候。建议各 IDE
厂商能把 formatR 作为标准的格式化工具直接嵌入编辑器的工具中。让我们把阅读别人的
代码,也变成一件快乐的事情吧。
1.5 多人在线协作 R 开发 RStudio Server
问题
R 语言开发,哪个工具最好用?
引言
RStudio 是 R 语言开发中的利器,是最好用的 R 语言 IDE 集成环境。RStudio Server 更
是利器中的神器。不仅提供了 Web 的功能,可以安装到远程服务器上,通过 Web 进行访
问,还支持多用户的协作开发。如此神器,快来动手试一下吧。
1.5.1 RStudio 和 RStudio Server
RStudio 是一个强大的、免费的、开源的 R 语言集成开发环境的应用软件,可以安装在
Windows、Linux 和 Mac 不同操作系统上。RStudio Server 是一个基于 Web 访问的 RStudio
云端开发环境,需要安装在 Linux 服务器上面,支持多用户远程访问使用。
1.5.2 RStudio Server 安装
本文使用的系统环境是:
Linux: Ubuntu Server 12.04.2 LTS 64bit第 1 章 R 语言基础包 23
R: 3.0.1 x86_64-pc-linux-gnu
IP: 192.168.1.13
注 RStudio Server 只支持 Linux 系统环境。下载最新版本 RStudio Server 的地址是
http:www.rstudio.comidedownloadserver.html。
在 Linux Ubuntu 环境中,下载并安装 64 位的 Rstudio Server:
~ sudo apt-get install gdebi-core
~ sudo apt-get install libapparmor1 Required only for Ubuntu, not Debian
~ wget http:download2.rstudio.orgrstudio-server-0.97.551-amd64.deb
~ sudo gdebi rstudio-server-0.97.551-amd64.deb
安装后,RStudio Server 会自动启动运行。
~ ps -aux|grep rstudio-server 查看RStudio Server 运行进程
998 2914 0.0 0.1 192884 2568 ? Ssl 10:40 0:00 usrlib
rstudio-serverbinrserver
可以看到,RStudio Server 的服务已启动,8787 端口被打开。
1.5.3 RStudio Server 使用
通过浏览器,我们访问 RStudio Server: http:192.168.1.13:8787,IP 地址为 RStudio
Server 服务器的地址,如图 1-6 所示。
图1-6 RStudio Server登录界面第一部分 R 基础 24
RStudio Server 登录需要用 Linux 系统的用户账号。如果想增加或减少用户,直接
对 Linux 系统用户进行操作就可以了。我的环境中用户登录,用户名是 conan,密码是
conan111。登录之后看到的界面如图 1-7 所示。
图 1-7 RStudio Server的Web界面
1. RStudio Server 的系统配置
RStudio Server 主要有两个配置文件,默认文件不存在。
etcrstudiorserver.conf
etcrstudiorsession.conf
设置端口和 ip 控制:
~ vi etcrstudiorserver.conf第 1 章 R 语言基础包 25
www-port=8080 监听端口
www-address=127.0.0.1 允许访问的IP 地址,默认为0.0.0.0
重启 Rstudio Server 服务器,配置生效:
~ sudo rstudio-server restart
会话配置管理:
~ vi etcrstudiorsession.conf
session-timeout-minutes=30 会话超时时间
r-cran-repos=http:ftp.ctex.orgmirrorsCRAN 设置CRAN 资源库
2. RStudio Server 的系统管理
启动、停止、重启 RStudio Server 服务器的命令如下:
~ sudo rstudio-server start 启动
~ sudo rstudio-server stop 停止
~ sudo rstudio-server restart 重启
查看运行中的 R 进程:
~ sudo rstudio-server active-sessions
PID TIME COMMAND
6817 00:00:03 usrlibrstudio-serverbinrsession -u zd
指定 PID, 停止运行中的 R 进程:
~ sudo rstudio-server suspend-session 6817
~ sudo rstudio-server active-sessions 再次查看进程
PID TIME COMMAND
停止所有运行中的 R 进程:
~ sudo rstudio-server suspend-all
强制停止运行中的 R 进程,此操作优先级最高,立刻执行。
~ sudo rstudio-server force-suspend-session
~ sudo rstudio-server force-suspend-all
RStudio Server 临时下线,不允许 Web 访问,并给用户友好的错误提示:
~ sudo rstudio-server of?ine
rstudio-server startrunning, process 6880
RStudio Server 上线:第一部分 R 基础 26
~ sudo rstudio-server online
rstudio-server startrunning, process 6908
RStudio Server 的其他操作和单机版的 RStudio 一样。
1.5.4 RStudio Server 多人协作
1. 增加新用户和新用户组
~ sudo groupadd hadoop 创建Hadoop 用户组
~ sudo useradd hadoop -g hadoop 创建Hadoop 用户并加入到 Hadoop 用户组
~ sudo passwd hadoop 设置Hadoop 用户的密码
~ sudo adduser hadoop sudo 增加Hadoop 用户到sudo组
~ sudo mkdir homehadoop 创建Hadoop 用户的home 目录
~ sudo chown -R hadoop:hadoop homehadoop 给homehadoop目录及子目录,设置用户权限
以 Hadoop 用户登录,检查用户是否设置成功
~ ssh hadoop@localhost 通过 ssh 远程登录
~ bash
~ pwd 查看登录后的访问目录
homehadoop
新打开浏览器窗口通过 Hadoop 账号登录 ,如图 1-8 所示。
图1-8 以 Hadoop 账号登录第 1 章 R 语言基础包 27
2. Git 代码共享
首先安装 Git:
~ sudo apt-get install git
~ ssh-keygen -t rsa 生成rsa密钥对
~ cat homeconan.sshid_rsa.pub 查看公钥
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDMmnFyZe2RHpXaGmENdH9kSyDyVzRas4GtRwMNx+qQ
4QsB8xVTrIbFayG2ilt+P8UUkVYO0qtUJIaLRjGySvQzzL7JKX12+VyYoKTfKvZZnANJ414d6oZpbDw
sC0Z7JARcWsFyTW1KxOMyesmzNNdB+F3bYN9sYNiTkOeVNVYmEQ8aXywn4kcljBhVpT8PbuHl5eadSLt
5zpN6bcX7tlquuTlRpLi1e4K+8jQo67H54FuDyrPLUYtVaiTNTxWN6IU+DQ9CbfykJ0hrfDU1d1LiLQ
4K2Fdg+vcKtB7Wxez2wKjsxb4Cb8TLSbXdIKEwSOFooINw25gAamvnVvW1 conan@conan-deskop
接下来,我们需要把本地项目上传到 Github。首先在 Github 上创建一个新的项目
rstudio-demo,地址为 https:github.combsspiritrstudio-demo,通过下面的操作上传本地目
录到 rstudio-demo 项目。
~ mkdir homeconanRgithub 创建rstudio-demo 项目目录
~ cd homeconanRgithub
~ git init 初始化Git
~ git add 增加当前目录及子目录到本地 Git库
~ git commit -m '?rst comment' 在本地Git库提交
~ git remote add origin git@github.com:bsspiritrstudio-demo.git
绑定当前目录和github 的项目
~ git push -u origin master 上传本地Git库中的代码到Github
打开 RStudio 设置到 homeconanRgithub 目录,tools–>version control –> project setup,如图 1-9 所示。
图1-9 在 RStudio 中,配置Github地址第一部分 R 基础 28
在 RStudio 中修改 sayHello.r 的代码:
sayHello<-function(name){
print(paste(hello,name))
}
sayHello(Conan)
sayHello(World)
点击 tools–>version control–> commit 提交,如图 1-10 所示。
图 1-10 通过RStudio进行 Git 操作
上传到 Github,只需要点击 tools–>version control–> push,如图 1-11 所示。
图 1-11 在 Github 上查看提交的操作第 1 章 R 语言基础包 29
RStudio 有如此强大的功能,极大地降低了编程的门槛。还没有用过的同学,赶紧去体
验一把极客的感觉吧!
1.6 R 和 JSON 的傻瓜式编程
问题
如何让 R 语言的数据类型转换成 JSON 数据类型?
引言
JSON 作为一种轻量级数据格式,被大量地应用在各种程序环境中。JSON(JavaScript
Object Notation) 是 JavaScript 的内嵌的标准对象,同时也是 MongoDB 的表结构存储类型。
JSON 是半结构化的,可以表达出丰富的文档含义。JSON 文档比 XML 文档要少很多,更
适合于网络传输。早期 R 语言编程很少会用到 JSON,但随着 R 语言的壮大,R 也在伸向
各种领域,JSON 就是与其他领域的一个交点。如何让 R 语言傻瓜式转型 JSON 呢?请看下
文介绍。
1.6.1 rjson 包介绍
rjson 是一个 R 语言与 JSON 进行转换的包,非常简单,支持 R 自身语言转型和基
于 C 类库的转型两种方式。rjson 包提供的函数只有 3 个,fromJSON, newJSONParser,toJSON。 后面我们将介绍如何使用 rjson 包。本节使用的系统环境是:
Windows 7: x86_64-w64-mingw32x64 (64-bit)
R: version 3.0.1
注 rjson 同时支持 Windows 7 环境和 Linux 环境。第一部分 R 基础 30
1. 安装并加载 rjson
> install.packages(rjson) 安装rjson
> library(rjson) 加载rjson
接下来,我们进行测试。新建 JSON 文件 fin0.json:
~ vi ?n0.json
{
table1: {
time: 130911,data: {
code: [
TF1312,TF1403,TF1406
],rt_time: [
130911,130911,130911
]
}
},table2: {
time: 130911,data: {
contract: [
TF1312,TF1312,TF1403
],jtid: [
99,65,21
]
}
}
}
2. 调用函数 fromJSON: 从 JSON 到 R
从 fin0.json 文件中,读取 JSON 并解析成 R 语言对象。我们通常把字节或者文字格式
转型为程序对象的过程叫反序列化过程,与之相反的过程,叫做序列化过程。第 1 章 R 语言基础包 31
> json_data <- fromJSON(paste(readLines(?n0.json), collapse=))
> json_data
table1
table1time
[1] 130911
table1data
table1datacode
[1] TF1312 TF1403 TF1406
table1datart_time
[1] 130911 130911 130911
table2
table2time
[1] 130911
table2data
table2datacontract
[1] TF1312 TF1312 TF1403
table2datajtid
[1] 99 65 21
检查转型后,对应 R 语言的数据类型:
> class(json_data)
[1] list
> class(json_datatable2)
[1] list
> class(json_datatable2data)
[1] list
> class(json_datatable2datajtid)
[1] numeric
> class(json_datatable1datacode)
[1] character
我们看到原 JSON 对象转型后,除最内层外,其他都被解析为 R 的列表 (list) 类型,最
内层则是基本 (numeric,character) 类型。在 R 对象结构中取 JSON 数据的一个叶子节点,JSON 的索引路径为 json.table1.data.code[0]。
> json_datatable1datacode
[1] TF1312 TF1403 TF1406
> json_datatable1datacode[1]
[1] TF1312第一部分 R 基础 32
3. toJSON 从 R 到 JSON
把 R 对象转型为 JSON 串,这个过程叫做序列化过程。还以刚才的 json_data 为例。
> json_str<-toJSON(json_data)
> print(json_str)
[1] {\table1\:{\time\:\130911\,\data\:{\code\:[\TF1312\,\TF1403\,\TF1406\],\rt_time\:[130911,130911,130911]}},\table2\:{\time\:\130911\
,\data\:{\contract\:[\TF1312\,\TF1312\,\TF1403\],\jt
id\:[99,65,21]}}}
> cat(json_str)
{table1:{time:130911,data:{code:[TF1312,TF1403,TF1406],rt_time
:[130911,130911,130911]}},table2:{time:130911,data:{contract:[TF1312,TF1312,TF1403],jtid:[99,65,21]}}}
我们只要使用 toJSON 函数,就可以实现 R 对象向 JSON 的转型。如果用 print 函数
输出,结果就是带转义的输出 (\) ;如果直接用 cat 函数输出,结果就是标准的 JSON 串格
式。把 JSON 输出到文件 fin0_out.json, 有 2 种方法,即 writeLines 和 sink。
> writeLines(json_str, ?n0_out1.json) writeLines 方法
> sink(?n0_out2.json) sink 方法
> cat(json_str)
> sink
虽然写法不同,但是输出结果是一个样的,writeLines 最后新建一个空行。
{table1:{time:130911,data:{code:[TF1312,TF1403,TF1406],rt_time:
[130911,130911,130911]}},table2:{time:130911,data:{contract:[TF1312,TF1312,TF1403],jtid:[99,65,21]}}}
4. C 语言库和 R 语言库转型,并进行性能测试
我们对 fromJSON 进行性能测试:
> system.time( y <- fromJSON(json_str,method=C) )
用户 系统 流逝
0 0 0
> system.time( y2 <- fromJSON(json_str,method = R) )
用户 系统 流逝
0.02 0.00 0.02
> system.time( y3 <- fromJSON(json_str) )
用户 系统 流逝
0 0 0第 1 章 R 语言基础包 33
我们可以看到,基于 C 语言库的操作比基于 R 语言库的要快,因为数据量很小,所以
0.02 并不明显。当 JSON 串很大的时候,这个差距就会变得相当大了。fromJSON 默认使用 C
语言库的方法,所以我们平时处理不用加 method='C' 的参数。下面做 toJSON 的性能测试。
> system.time( y <- toJSON(json_data,method=C) )
用户 系统 流逝
0 0 0
> system.time( y2 <- toJSON(json_data,method = R) )
用户 系统 流逝
0.02 0.00 0.01
> system.time( y3 <- toJSON(json_data) )
用户 系统 流逝
0 0 0
解释同前。
1.6.2 RJSONIO 包介绍
RJSONIO 包,提供了 2 个主要的操作,把 JSON 串反序列化成 R 对象,把 R 对象序列化
成 JSON 串。RJSONIO 包的两个主要函数是 fromJSON, toJSON,它还包括几个辅助函数,即 asJSVars, basicJSONHandler, Bob, isValidJSON, readJSONStream。RJSONIO 包解决
了 rjson 包序列化大对象慢的问题。RJSONIO 依赖于底层的 C 语言类库 libjson。
1. 安装并加载 RJSONIO
> install.packages(RJSONIO)
> library(RJSONIO)
2. fromJSON 从 JSON 到 R
同 rjson 一样,测试 fromJSON 函数。
> json_data <- fromJSON(paste(readLines(?n0.json), collapse=))
> json_data
table1
table1time
[1] 130911
table1data
table1datacode
[1] TF1312 TF1403 TF1406
table1datart_time
[1] 130911 130911 130911第一部分 R 基础 34
table2
table2time
[1] 130911
table2data
table2datacontract
[1] TF1312 TF1312 TF1403
table2datajtid
[1] 99 65 21
我们发现与 rjson 的结果是一样,R 对象除最内层外,其他都是列表 (list) 类型。下面
取叶子节点:
> json_datatable1datacode
[1] TF1312 TF1403 TF1406
> json_datatable1datacode[1]
[1] TF1312
3. toJSON 从 R 到 JSON
做 toJSON 的性能测试:
> json_str<-toJSON(json_data)
> print(json_str)
[1] {\n \table1\: {\n \time\: \130911\,\n\data\: {\n \code\:
[\TF1312\, \TF1403\, \TF1406\ ],\n\rt_time\: [ 1.3091e+05, 1.3091e+05,1.3091e+05 ] \n} \n},\n\table2\: {\n \time\: \130911\,\n\data\: {\n
\contract\: [ \TF1312\, \TF1312\, \TF1403\ ],\n\jtid\: [99,65,21 ] \n} \n} \n}
> cat(json_str)
{
table1: {
time: 130911,data: {
code: [ TF1312, TF ......
您现在查看是摘要介绍页, 详见PDF附件(4093KB,123页)。





