序一

生活中我是三分熟的牛排,张丹兄是五分熟的牛排,一天他给我发邮件邀请我写序,我好些天都没答复,为什么呢?因为我们互相都不熟啊!嘿嘿,好冷。从没有人找我写过序,张丹有胆找一个浑身负能量爆棚的新手及话痨写,还说自由发挥,风格不限,作者自己都不怕,我怕啥,大不了把脖子往你们面前一横!当然那是张丹的脖子……其实我自己看书一般不太看推荐序(除非里面有重大八卦),因为推荐序里通常也就是友情帮点一百二十八个赞,你要是像鲁迅先生那样半夜爬起来翻看推荐序,当然你肯定不会看见“吃人”两个字,而是看见一个特殊的变量值:NULL。哎呀,我这只是夸张的说法啦,推荐序没那么糟糕,我也并非和张丹完全不熟,我看过他写的很多博客文章。好了,言归正传。在下谢益辉,身患统计学永久性脑损伤,目前在RStudio当码农,天天蹲A村村口敲代码。十年前在中国人民大学统计学院上大三(哥也年轻过),侥幸没被统计计算课上的R语言折磨死,按照我们疯人院(没有含沙射影的意思,请读者切勿自动匹配)的规矩:你上回没弄死我,这次你在前面跑,换我来弄死你好了。就这样R语言成了我快乐生活的一部分。咦,为什么有一种细思恐极的感觉?

作为一名不那么极的R极客,我自然乐意看到一本写给极客的书。在这个数据时代(千万别再跟我提“大”数据,否则我立刻变身纯生牛排给你看),各种新技术风起云涌,需要有人坐一段时间冷板凳,为我们收拾整理这些技术,让那些从证明三种中心极限定理的苦海中逃出来的研究生们毕了业不要立马又陷入另一片五种数据库引擎的苦海。我花了一晚上加一白天的时间才看完《R的极客理想》的书稿,看不懂和看得懂的地方都跳着看,看不懂主要是因为我没有计算机背景(我学习的第一门计算机语言是VB,你们笑我可以,别笑出声就好,不过我还写过VBScript呢,这次你们可以笑出声了),例如Java,我多年前曾经自学过一阵,现在都忘光了,写个“你好世界”的程序都需要搜一下;看得懂的地方主要是纯R的内容,不过有些地方还是慢慢看了,比如formatR包那里,主要是看张丹有没有黑我。算他识相没黑我,那好,我在序言里可以放心……黑他了;江湖险恶,你不中箭谁中箭?

整本书涵盖的内容比较广,每一节的篇幅相对较短,我觉得这种写作风格挺好,每天晚上睡前打开一节看看,在口水浸湿书之前应该可以看完一节,既能学到知识又合理利用了睡前时间。如作者自己所说,这书不是写给初学者的,所以看第1章的不要被“R基础”的标题给骗了,全是些奇门遁甲之术,一个基础包都没介绍!虽然我不敢讲R是不是最值得学习的程序语言,但我对1.1节的观点深表同意:R往往用两三行代码解决问题,不会时时考虑最优与否(很多需要优化的地方都已经用C/Fortan等底层语言打包好了)。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啊,HTML/CSS啊,都是非常容易入门的技术,作为统计出身的我,大力推荐大家掌握一点这种低投入高产出而且又有趣的计算机知识。Cairo是另一位大极客的作品,我在他手下呆过两个多月,其聪明程度以及掌握的计算机知识之广总令我惊叹,例如后面章节中介绍的Rserve、FastRWeb以及RCassandra都是他单枪匹马的作品,一个比一个极,问题就是极过了以至于很少有人知道,所以也没见广泛应用。有时候我都想,你懂得这么多东西你家里人知道吗?他家里人知不知道没关系,起码现在我们知道张丹帮了个大忙,让他的几份作品至少多了一些中国读者。有志于成为极客的码农们,在忍受孤独的同时,我觉得真的应该好好想想为什么你做的东西没有广为人知,就算你不想这个问题,也该想想怎么到今天还没有女朋友吧,这两个问题背后肯定有共同原因。如张丹引用我的话所说,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的原理,然而我回去看到/var/FastRWeb/这个目录的时候就已经暗自决定抛弃它了。我个人对那些需要sudo才能运行且存放在非标准位置的程序有抵触心理,因为我下次一定会忘记怎么运行它以及配置文件在什么位置。Rserve和FastRWeb在它们被发明的年代里绝对都是划时代的,在服务器端跑基于R的服务是很多码农的梦想,还记得那些年我们一起追的Rweb吗?如今回头看看,还有多少人记得并用着CGI?可喜的是,张丹在第5章也介绍了WebSocket技术,这也是一个相对较新、很有趣且有用的话题,建议读者好好研究。书中提到websockets包已经被移出CRAN,什么原因我也不知道,不过我基本上确定httpuv包可以取代它,也许是websockets的作者看到httpuv的工作之后决定不要重复劳动了。httpuv包是shiny包的核心技术之一,如今捣鼓R的服务器端应用,怎么能忽略shiny?shiny比Rserve/FastRWeb出现晚了近十年,为什么前者迅速流行起来,而后者尽管带着划时代的思想和技术,却被广大用户忽略,极客们应该再次好好想想。有读者可能会说,切,shiny是你们厂(RStudio)的产品,你当然自卖自夸啦!是不是这样呢,我们且留给时间检验。

第三部分的两章就是数据库八仙过海各显神通了,我仅仅粗浅了解一点MySQL,请Hadoop/NoSQL同行们不要笑出声。作为入门教程,这些章节都不错,从安装到“你好世界”的例子都有介绍,十八般武艺入门之后的事情大家都知道,遇到问题搜索就是了。

极客不是一种身份,而是一种态度。在我眼里,这个词是中性的,极客不代表一个人有多牛,而是他的钻研态度、好奇心以及对新技术的识别和接受能力。有些很牛很聪明的人,未必能把聪明才智转化为生产力(请勿对号入座)。张丹这本书给大家提供了一条通向R的极客之路,但这绝对不是终点。技术人士容易沉迷于技术,就像科学研究人士迷信某一种科学一样,唉,我就是这样浑身负能量。希望读者通过这本书能感受到作者探索的乐趣,保持开放心态,积极学习,然后找到适合自己的极客理想(以及女朋友!相信我,后者会让前者更快实现)。写序似乎应该说点鼓励的话吧,我没写过也不清楚贵圈的规矩,那么就引用麦太的话好了:从前有一位小朋友他很努力学习,后来他发财了。

谢益辉

2014年6月23日于A村

(吝啬的房东一直不给我修空调,已热哭,决定在最后这个黄金广告位狠狠黑她一把,叫她随便得罪码农!)