R Markdown Notebook 与 Jupyter / IPython Notebook

谢益辉 2017-06-19

我现在一般不掺和语言或工具圣战,我没那闲工夫,而且现在也有了足够的定力。放在早年间,比如要是碰到 SAS 与 R 的问题,那就算不吃不睡也要参与瞎叨叨。

2013 年我提过 IPython 的教主以及推想过他想弄啥。现在回看,果然以及显然是要一统江湖,Jupyter 把 Python / R / Julia 三张王牌同时打出来了。教主听过我两次报告,这两次报告的提问环节他都问了我同一个问题,是关于 R Markdown 的一个弱项。如果是第一次问,我可以理解这是个问题;但第二次还要在不同的观众面前问我同样的问题,那显然就不是问给我的了,而是告诉观众:嘿,你们看,R Markdown 有这一点不足哟。嗨,我就是整天如此小人之心1。好在我现在已经不再怕被问这个问题,因为 R Markdown Notebook 已经解决了它。

其实我完全可以怼他类似的关于我眼中的 IPython 的弱项问题,但我这些年并没有说话,埋头干活儿少打仗。这些年我也没见谁说这个问题,直到前两天终于有人提到了我脑子里的问题,那就是由于 R Markdown 它爹 knitr 继承了 Sweave 爷爷的一项基因,让文本行内可以很方便嵌入代码来计算单个结果,比如,“半径为 `r (x = 3)` 米的圆,其面积为 `r pi * x^2`”,这样的文字经过 knitr 编译可以直接嵌入数值结果,用户可以动态修改 x 的数值,而圆的面积数值会自动更新。由于 IPython 的设计是基于代码块(单元格)的,它没法直接写这样的语句,只能绕道。

好了,对 knitr 的王婆自夸就到此结束。我相信这些竞争的产品肯定一直都会互相学习改进,这也是开源社区的魅力所在2。下面开始小夸一下敝厂。

我想臆断的是,一个三观正3的商业公司来认真做开源时,其效率可以非常之惊人,可能比学术界或者纯开源团队效率要高得多。在学术界做东西,很多人可能最大的动力只是自己,譬如 R 核心团队中的某核心某年就公开说:寡人开发 R 只是为了寡人自己的兴趣。言下之意,要是寡人的兴趣和尔等的兴趣碰巧一致,尔等可以弹冠相庆,否则也表怪寡人不理会尔等的请求。

我加入 RStudio 工作这几年,跟学生时代相比,虽然都有个头头管着,但最大的区别就是在学术界时,做东西做不做得成都有饭吃,总可以糊弄交差,但在公司,那个头头就会让我隔三差五感到心里不舒服。事实上两年前我还经历了一场很大的精神危机,这事将来我应该会再细说。总之,在公司的不舒服比在学校时的不舒服要难受得多,这也是事情能有时间和质量保障完成的关键因素,所以一直以来我非常感激我们这位头头,要没有他持之以恒鞭挞我,我今天还不知会沦落在什么地方摸鱼。敝厂对人才的重视和尊重程度可以说令人发指4,但我并不是一个能有效享受这种自由的人,比如在家远程工作对我来说真的是非常大的挑战,至今我都还没训练出我满意的自制力。不过有了这种自由的气氛,众码草履虫、码畜、码农、直至仁波切们才能最充分地发挥才智,尽力去打最漂亮的仗。


  1. 此处备择假设是,他忘记前不久问过我这个问题了。 ↩︎

  2. 当然,站在全人类的角度来说,这些竞争也有相当大的内耗。统一语言、一起合作当然是最理想的情况,但语言哪里统一得了呢? ↩︎

  3. 发自内心热爱开源事业。 ↩︎

  4. 譬如休假政策是“想休就休”,何时休以及休多久你自己看着办,没有什么多少天年假一说,当然前提是你把活儿干好。对卖力工作的员工,敝厂会更卖力奖励。 ↩︎