---
title: R Markdown Notebook 与 Jupyter / IPython Notebook
date: '2017-06-19'
slug: notebooks
---

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

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

<!-- 教主的问题是：当你把一个报告分享给别人时，别人如何获得它的源文档。因为 R Markdown 最初的设计是源文档与输出文档分离，所以当时并没有直接的办法把源文档嵌入输出文档中。而 IPython Notebook 则是源文档和输出文档混在一个 JSON 文件里。现在 R Markdown Notebook 也可是实现在输出中嵌入源文档。当然就算不是 Notebook，你也可以用 xfun::embed_file() 嵌入。 -->

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

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

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

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

[^1]: 此处备择假设是，他忘记前不久问过我这个问题了。

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

[^3]: 发自内心热爱开源事业。

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