Matt:“老子在给世界上最大的金融机构打工,你竟然说 BUG 修复要等6个月?!”
S-PLUS 客服:“为什么你不试试 R 呢?”
说着一口伦敦音的 Matt Dowle 个子不高,方方正正的脸,第一眼看上去有点略显紧张的神经质,是那种在英剧中典型的面孔。虽然不像 Hadley Wickham (请大家猛戳大猫上期的《Hadley Wickham 采访节选》)那样多产(Hadley目前已经在CRAN上发布了40多个包了),但是 Matt 凭着自己的 data.table 包成为了 R 圈最有影响力的开源包作者之一。
(Matt 演讲照片,是不是有种英剧里出来的赶脚?)
data.table 是大猫认为最优秀的数据处理包,不管从语法还是性能上大猫认为都要比 dplyr 优秀。截至2016年12月30日,data.table 是 StackOverflow上有关 R 的第三大 tag,下面一共4912个帖子,而 dplyr 为4063。data.table 也是 github 中第八大受关注的 R 开源项目。此外,data.table是目前 RStudio CRAN 镜像中下载最多包。要知道 Hadley 可是 RStudio 的首席科学家,能在“敌方大本营”取得这样的认可实属不易。在实战中,data.table 获得了 Kaggle 排名第一的 Gilberto 的青睐,他的原话很直接—— data.table is COOL!!!
本视频来自 YouTube,是 Matt Dowle 在 useR! 2014年洛杉矶会议上的演讲。在这段21分33秒的演讲中,Matt 回顾了自己在伦敦大投行的工作经历(雷曼兄弟以及所罗门兄弟)、自己与 R 的偶遇以及开发 data.table 的动机。演讲全程笑声不断,充分体现了腐国人一本正经说笑话的能力╮(╯▽╰)╭
1996年我本科毕业,拿到了数学和计算机的学位,开始在伦敦的雷曼兄弟工作(大投行啊!)当时我掌握的技能并不多:VB/EXCEL + Sybase SQL + Windows + Unix。1999年,我跳槽到伦敦的所罗门兄弟(也是当时最大的投行之一),在所罗门兄弟的第一天,我遇到了 S Poertry (R 的某个祖先)的作者 Patrick Burns——这个男人就是以后所有故事的起点。(别开脑洞!)
以下是我(Matt)和 Patrick (简称 Pat)的对话:
Pat:嗨我亲爱的Matt,我们这儿都在用 S-PLUS。
Matt:S-PLUS 是啥?
Pat:S-PLUS 可牛逼了!我现在就给你演示一下!
于是 Pat 当场输入了以下代码:
> DF <- data.frame(
A = letters[1:3],
B = c(1, 2, 3))
> DF
A B
1 a 1
2 b 3
3 c 5
Pat:我刚才输入了两列,每一列的长度都相同,但是可以是不同的数据类型!
Matt:所以说 data.frame 就像是 SQL 里面的 datatable 一样咯?
Pat:Yes!
Matt:棒极了。所以说,你不需要像在 SQL 里先用 CREATE TABLE 语句建立一个表然后再用 INSERT 语句插入数据咯?
Pat:没错,现在你可以一步搞定。
Matt:Show me more!
于是 Pat 又输入了以下代码:
> DF[2:3, ]
A B
2 b 3
3 c 5
Matt:WOW! 我不需要像在 SQL 里必须新建一列 row number 就可以完成对表格的提取了?
Pat:说的没错。行数已经存储在内存中了,这样一来时间序列分析就特别方便。
Matt:嗯……因吹斯听。所以我现在可以这样做咯?
Matt 说着输入了以下代码:
DF[2:3, sum(B)] # 3+5=8
Pat:啊亲爱的朋友,你不能这样做。
Matt:Why?
Pat:你必须要这样做
sum(DF[2:3, "B"])
Matt:OK,但为什么我刚才这样就不行呢?
Pat:因为不行。
Matt:为什么不行?Come on。
Pat:因为它就是不行!╮(╯▽╰)╭
Matt:那如果按照我刚才输入的代码,最终结果是什么呢?
Pat:什么也不是。
Matt 后来经过了多次尝试,返回的永远都是错误:
object "B" not found
Pat:我早和你说了,那样做不行,放弃挣扎吧年轻人。
Matt:我们能让 S-PLUS 改吗?(S-PLUS 当时是商业软件)
Pat:祝你好运。
有一天 S-PLUS 闪退了。我很确定这不是我代码的原因,而是 S-PLUS 的问题。
客服:你确定不是你自己 XJB 操作?
Matt:当然不是。来,我把代码给你,你自个儿运行一遍。
客服:嗯……你是对的。我们会修复的,谢谢反馈!
Matt:太棒了,什么时候?
客服: 下个版本出来我们第一时间修复。
Matt:呃……下个版本是什么时候?
客服:六个月后。
Matt:你们就不能推出一个快速补丁吗?
客服:不行,因为就你一个人出问题。
Matt:WTF?老子是所罗门的,属于花旗集团,老子在给世界上最大的金融机构打工!
客服:你说的没错,但出问题的还是只有你一个,Matt。
Matt:好吧。那你们能把代码发给我吗?我来修复它——我不要报酬,我只想让完成我的工作。
客服:很抱歉,我们不能这样做。律师说 No。
Matt:那你有什么别的建议吗?
客服:你说过 R 吗?
Matt:啥是 R ?
后来我下载了 R,在几乎没有任何改动的情况下把 S-PLUS 的代码粘贴了过去。代码的主要任务是生成许多随机资产组合,因此它包含一个很长的 for 循环。神奇的是,原来需要一个小时才完成的任务,R用一分钟就完成了。
我当时惊讶极了,仔细核对了一遍结果,发现是正确的。我后来才知道,原来早在12年前(这是2014年的演讲), R 已经大大提高了 for 循环的速度,并且把所有的数据都保存在内存中,而不是放在硬盘上。
更重要的是,R 在运行这段程序的时候不再闪退了。其实哪怕 R 出了问题,我也能修复它,因为我有了源代码!实在不行,我也能雇别人修复它。要知道,我是在花旗集团打工,花旗集团永远不缺牛逼的程序员。
总而言之,从那时开始我就不再用 S-PLUS 了。我不用再傻乎乎地等六个月,我也不用再在电话里试图说服别人要帮我推出快速补丁,我独立了!更重要的是,我有了那么多第三方开源包。
也是在那时,三年前的那个想法再次冒了出来:我能够让下面的代码在 R 中运行吗?
sum(DF[2:3, "B"])
(未完待续)
下期内容看大猫的论文进展速度 Orz……
欢迎大家关注微信公众号:数萃大数据