跳至主要内容

Jupyter 与 R Markdown:使用 R 的笔记本

学习如何在 Jupyter Notebook 和 RStudio 的 R Notebook 中安装、运行和使用 R,并了解实用技巧与替代方案
Karlijn Willems
Karlijn Willems

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

在处理数据科学问题时,您可能希望设置一个交互式环境,以便与他人共同开展项目、编写并分享代码。使用笔记本就能轻松实现这一点。

在其他情况下,您也许只想就工作流程以及为分析数据科学问题而收集的结果进行交流。为了实现透明且可复现的报告,笔记本同样会派上用场。

没错;当您希望将纯文本与图形、计算等富文本元素相结合时,笔记本再合适不过。

本教程将涵盖以下主题:

R 与 Jupyter Notebook


与您可能的直觉不同,Jupyter 并不限于 Python:该笔记本应用对语言是中立的,这意味着您也可以使用其他语言。

在 Jupyter 中使用 R 通常有两种方式:使用内核,或搭建包含数据科学入门所需全部基本工具的 R 环境。

通过 R 内核在 Jupyter 中运行 R

如上所述,第一种方式是使用内核。如果您想查看 Jupyter 中所有可用内核的完整列表,请前往此处。

要使用 R,您需要加载 IRKernel 并激活它,才能在笔记本环境中开始使用 R。

首先,您需要安装一些包。请确保不要在 RStudio 控制台中执行,而是在常规 R 终端中运行,否则会出现如下错误:

Error in IRkernel::installspec() :
Jupyter or IPython 3.0 has to be installed but could neither run “jupyter” nor “ipython”, “ipython2” or “ipython3”.
(Note that “ipython2” is just IPython for Python 2, but still may be IPython 3.0)
$ R

> install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))

该命令会提示您输入数字以选择一个 CRAN 镜像来安装所需包。输入数字后安装将继续。

> devtools::install_github('IRkernel/IRkernel')

然后,您仍需让 Jupyter 能识别到 R 内核:

# Install IRKernel for the current user

> IRkernel::installspec()

# Or install IRKernel system-wide

> IRkernel::installspec(user = FALSE)

现在使用 jupyter notebook 打开笔记本应用。创建新笔记本时,您会在内核列表中看到 R。

在 Jupyter 中使用 R Essentials 环境

第二种快速使用 R 的方式是在当前环境中安装 R essentials:

conda install -c r r-essentials

这些“基础包”包括 dplyr、shiny、ggplot2、tidyr、caret 和 nnet。如果您不想在当前环境中安装这些基础包,可以使用以下命令专门为 R essentials 创建一个新环境:

conda create -n my-r-env -c r r-essentials

现在打开笔记本应用,开始使用 R 吧。

您可能会想,如果要为数据科学项目安装更多包该怎么做。毕竟这些包足以起步,但您可能还需要其他工具。

您可以通过运行如下命令来构建 Conda R 包,例如:

conda skeleton cran ldavis conda build r-ldavis/

或者,您也可以在 R 内通过 install.packages() 或 devtools::install_github (从 GitHub 安装包)安装。您只需确保将新包添加到 Jupyter 使用的正确 R 库中:

install.packages("ldavis", "/home/user/anaconda3/lib/R/library")

如果您想了解更多有关内核或在 Docker 环境中运行 R 的信息,请查看此页面。

为 Jupyter 增添一些 R Magic

使用笔记本的一大优势在于其提供的交互式环境。这种交互性主要源自所谓的“magic 命令”。

这些命令允许您在 Python 与命令行指令之间切换,或用 R、Julia、Scala 等其他语言编写代码。

要从 Python 切换到 R,您首先需要下载以下包:

%load_ext rpy2.ipython

之后,您就可以开始使用 R,或在数据分析中通过 %R magic 命令轻松在 Python 与 R 之间切换。

下面用一个小例子演示 R magic 的用法:

# Hide warnings if there are any
import warnings
warnings.filterwarnings('ignore')
# Load in the r magic
%load_ext rpy2.ipython
# We need ggplot2
%R require(ggplot2)
# Load in the pandas library
import pandas as pd 
# Make a pandas DataFrame
df = pd.DataFrame({'Alphabet': ['a', 'b', 'c', 'd','e', 'f', 'g', 'h','i'],
                   'A': [4, 3, 5, 2, 1, 7, 7, 5, 9],
                   'B': [0, 4, 3, 6, 7, 10,11, 9, 13],
                   'C': [1, 2, 3, 1, 2, 3, 1, 2, 3]})
# Take the name of input variable df and assign it to an R variable of the same name
%%R -i df
# Plot the DataFrame df
ggplot(data=df) + geom_point(aes(x=A, y=B, color=C))

如果您想进一步了解 Jupyter,如如何设置笔记本、在哪里下载应用、如何运行(通过 Docker、pip install 或 Anaconda 发行版)等,请查看我们的权威指南。

R Notebook


直到最近,Jupyter 一直是 R 用户的热门选择之一,此外还有 Apache Zeppelin 或 Beaker 等笔记本。

同时,用于报告数据分析结果的其他方案,如 R Markdown、Knitr 或 Sweave,也在 R 社区中非常流行。

不过,随着 RStudio 推出 R 或 R Markdown Notebook,这一局面可能会发生变化。

可以看到,R Markdown Notebook 所处的语境较为复杂,值得回顾 R 领域可复现研究的历史,以理解推动该笔记本创建与发展的动力。最终,您也会意识到,这类笔记本与其他产品有所不同。

R 与可复现研究的历史

在他的演讲中,J.J Allaire 指出,R 自身为实现可复现研究所做的努力、Emacs 在文本与代码、输入的结合方面的探索,以及 Pandoc、Markdown、knitr 项目与各类计算型笔记本,这些路径长期并行发展、相互影响,最终促成了 R 笔记本的诞生与演进。

首先,计算型笔记本历史悠久:自 80 年代末 Mathematica 前端发布以来,相关领域有诸多进展。2001 年,Fernando Pérez 开始开发 IPython,但直到 2011 年团队才发布 IPython 0.12 版。SageMath 项目起步于 2004 年。此后陆续出现了许多笔记本。对数据科学社区而言,较为知名的有 Beaker(2013)、Jupyter(2014)与 Apache Zeppelin(2015)。

其次,促成 RStudio 笔记本应用诞生的还有标记语言与文本编辑器,尤其是 Emacs、Markdown 与 Pandoc。Org-mode 于 2003 年发布,是自由软件文本编辑器 Emacs 的一种用于笔记、规划与写作的编辑与组织模式。六年后,Emacs org-R 出现,为 R 用户提供支持。另一方面,Markdown 于 2004 年发布,作为一种标记语言,允许您以一种可以转换为 HTML 或其他格式的方式来排版纯文本。再往后几年,Pandoc 发布,既是写作工具,也是出版工作流的基础。

最后,R 社区为确保研究可复现与透明所做的努力也推动了 R 笔记本的兴起。2002 年,Sweave 被引入,用于在 LaTeX 文档中嵌入 R 代码以生成 PDF 文件。这些 PDF 文件将叙述、分析、图形、代码和计算结果结合在一起。十年后,knitr 被开发出来,以解决 Sweave 的长期问题,并将其他扩展包中的功能整合到一个包中。它是 R 中用于动态报告生成的透明引擎,支持任意输入语言与任意输出标记语言。

同样在 2012 年,R Markdown 作为 Markdown 的一个变体被创建,能够嵌入 R 代码块,并可与 knitr 搭配用于创建可复现的 Web 报告。其主要优势在于不再需要使用学习与使用门槛较高的 LaTeX。R Markdown 的语法与常规 Markdown 非常相似,但也有一些调整,例如可以包含 LaTeX 公式。

R Markdown 与计算型笔记本

R Markdown 可能是 R 社区中用于报告数据分析的最受欢迎的选项之一。因此,它仍然是 R Markdown Notebook 的核心组件,这不足为奇。

R Markdown 与笔记本确有一些共通之处,例如提供可复现的工作流程,将代码、输出与文本编织到单一文档中,支持交互式小部件,并能输出为多种格式。但它们的侧重点不同:R Markdown 侧重可复现的批量执行、纯文本表示、版本控制、生产级输出,并提供与编写 R 脚本相同的编辑器与工具。

另一方面,传统的计算型笔记本强调与代码内联输出、跨会话缓存输出、共享代码并以单文件输出。笔记本偏重交互式执行模型。它们不采用纯文本表示,而是使用如 JSON 等结构化数据表示。

这也解释了 RStudio 笔记本应用的目标:把 R Markdown 的优势与计算型笔记本的优点结合起来。

因此,R Markdown 是 R Markdown Notebook 的核心组件:RStudio 将其笔记本定义为“一个 R Markdown 文档,其中的代码块可独立、交互式地执行,且输出会立即显示在输入下方”。

如何使用 R Notebooks


如果您用过 Jupyter 或其他计算型笔记本,会发现其工作流程非常相似。有一点默认情况下看起来不同:您不再主要使用代码单元,而是更像在文本编辑器中,通过 R Markdown 标记代码块。

如何安装并使用 R Markdown Notebook

使用笔记本的首要条件是您的电脑上安装了最新版本的 RStudio。由于笔记本是 RStudio 的新功能,仅在 1.0 或更高版本中提供。因此,检查是否安装了正确版本非常重要。

如果您没有 RStudio 1.0 或更高版本,可在此处下载最新版本。

然后,要新建笔记本,请转到 File 选项卡,选择“New File”,您将看到创建 R Markdown Notebook 的选项。如果 RStudio 提示更新某些包,请接受,随后会出现一个新文件。

提示:请再次确认您正在使用笔记本,方法是查看文档顶部。输出应为 html_notebook。

您会看到文档中出现的默认文本是 R Markdown。R Markdown 对您来说应该比较熟悉;如果还不太熟练,您可以查看我们的R Markdown 报告课程或学习 RStudio 提供的资料。

对比 Jupyter 与 R Markdown

注意,您可以随时使用齿轮图标调整笔记本的工作区:可以展开、折叠和移除代码输出,改变预览选项并修改输出选项。

如果您想更改语法高亮、应用不同主题、调整输出中图形的默认宽高等,最后这个选项会非常有用。

接下来,您就可以开始插入代码块和文本了!

添加代码块有两种方式:使用键盘快捷键 Ctrl + Alt + I 或 Cmd + Option + I,或使用工具栏中的插入按钮。

使用 R Markdown 笔记本的优势之一在于,您可以通过左侧的小绿条跟踪大段代码块或一次执行多个代码块时的进度。此外,底部还有进度条。

下方动图展示了绿色进度条:

使用 R Notebook

关于代码执行:您可以通过多种方式执行 R 代码块。

您可以运行单个代码块或下一个代码块,运行其下方或上方的所有代码块;也可以选择重启 R 并运行全部代码块,或重启并清除输出。

注意,当您执行笔记本中的代码时,输出也会显示在控制台!对于通常使用 Jupyter 等其他计算型笔记本的用户来说,这可能是个较大的差异。

如果在执行代码块时出现错误,执行将停止,并在产生错误的代码旁显示红色条。

您可以通过在代码块选项中添加 errors = TRUE 来避免执行中断,如下所示:

```{r, error=TRUE}
iris <- read.csv(url("http://mlr.cs.umass.edu/ml/machine-leaning-databases"), header = FALSE)
names(iris) <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
```

注意,错误仍会显示,但笔记本的代码执行不会被中断!

如何使用 R Markdown Notebook 的“魔法”

与 Jupyter 类似,您也可以在 R Markdown 笔记本中进行交互式工作。其方式与 Jupyter 略有不同,因为没有真正的 magic 命令;要使用其他语言,您需要在笔记本中添加单独的 Bash、Stan、Python、SQL 或 Rcpp 代码块。

这些选项看起来也许有限,但工具栏中的插入按钮让添加此类代码块变得非常容易。

使用这些代码块也很简单:您可以在 J.J Allaire 发布的此文档中看到 SQL 代码块的示例。对于 Bash 命令,直接输入命令即可。无需像在 Jupyter 中那样使用“!”之类的额外字符来表明您在使用 Bash。

如何导出 R Markdown 笔记本

在渲染笔记本的最终版本之前,您可能希望预览当前的成果。工具栏中提供了一个便捷功能可实现预览。

点击“preview”按钮,文档的临时版本会在右侧的“Viewer”标签页中弹出。

通过在笔记本顶部的首段添加一些行,您可以调整输出选项,如下所示:

---
title: "Notebook with KNN Example"
output:
  pdf_document:
    highlight: tango
    toc: yes
  html_notebook:
    toc: yes
---

要查看可从哪里获取这些发行版,您可以尝试 knit,一旦运行,控制台输出将给出可下载所需包的网站。

请注意,这只是导出笔记本的众多选项之一:您还可以渲染 GitHub 文档、Word 文档、beamer 演示文稿等。这些都是常规 R Markdown 文件已有的输出选项。更多信息见此处。

R Notebook 的使用技巧


除了需要牢记的一般编码实践(如为代码撰写文档、采用一致的命名规则、代码分组与名称长度控制)外,您还可以使用以下技巧,让笔记本更便于他人使用与阅读:

  • 与计算型笔记本相同,将较大的代码块或会生成多个输出的代码块拆分为多个块可能更方便。这样可以改善整体使用体验并提升笔记本的透明度。
  • 利用键盘快捷键加快工作节奏。大多数快捷键都可在工具栏中对应的命令旁找到。
  • 使用工具栏中的拼写检查器,确保报告中的用词准确无误。
  • 当笔记本代码较多时,利用隐藏代码的选项。您可以通过代码块选项或直接在笔记本的 HTML 文件中实现!

R Notebook 与 Jupyter Notebook 对比


除了上文提到的 Jupyter 与 R Markdown 笔记本之间的差异外,还有一些其他方面需要注意。

让我们来比较一下 Jupyter 与 R Markdown Notebook!

有四个方面值得重点考虑:笔记本分享、代码执行、版本控制与项目管理。

笔记本分享

R Markdown 笔记本的源文件是 .Rmd。但当您保存笔记本时,会同时生成一个 .nb.html 文件。这个 HTML 文件是关联文件,其中包含 R Markdown 源代码与生成的输出副本。

这意味着您无需专门的查看器即可查看该文件;而 Jupyter 应用创建的笔记本是纯 JSON 文档,或其他计算型笔记本采用结构化格式输出,可能需要特定查看器。您可以将 R Markdown 笔记本发布到任意 Web 服务器、GitHub,或作为电子邮件附件发送。

同时也提供用于渲染与解析 R Markdown 笔记本的 API:这让其他前端工具可以为 R Markdown 构建笔记本创作模式,或用于在不同笔记本格式之间进行转换。

在 Jupyter 应用中,您可以将笔记本导出为幻灯片、博客、仪表板等形式以分享。更多信息见本教程。此外,默认还可以生成 Python 脚本、HTML 文件、Markdown 文件、PDF 文件或 reStructured Text 文件。

代码执行

R Markdown Notebook 支持运行单个代码块或下一个代码块,运行其下方或上方的所有代码块;此外,您还可以选择重启 R 并运行全部代码块,或重启并清除输出。

在使用 R 时,这些选项很有意义,因为 R Markdown Notebook 允许所有 R 代码片段共享同一环境。然而,如果您使用非 R 代码片段,由于它们不共享环境,这可能成为一个较大的劣势。

总体而言,这些代码执行选项为那些曾对 Jupyter 提供的执行方式感到束缚的用户提供了更多灵活性,尽管二者并无太大差别:在 Jupyter 中,您可以运行单个单元、运行多个单元、运行全部单元,也可以选择清除当前或全部输出。代码环境在单元之间共享。

版本控制

有人认为 Jupyter 会干扰笔记本的版本控制,或使用 git 管理这些笔记本较为困难。对此的解决思路包括将笔记本导出为脚本,或设置过滤器修正不应在提交时变化的元数据部分,或剥离运行计数与输出。

R Markdown 笔记本似乎更易于处理这一问题:由于其有关联的 HTML 文件保存了代码输出,同时笔记本文件本质上是纯文本文件,因此版本控制会容易得多。您可以只将 .Rmd 文件提交到 GitHub 或其他版本管理系统,也可以一并包含 .nb.html 文件。

项目管理

由于 R Markdown Notebook 原生集成于 RStudio 开发套件中,笔记本可与您的 R 项目无缝衔接。此外,这些笔记本还支持包括 Python、C 和 SQL 在内的其他语言。

另一方面,Jupyter 项目并非任何开发套件的原生组件:因此,要将其与您的项目实现无缝集成可能需要一些工作。但它支持的语言更多,如果您希望使用 Scala、Apache Toree、Julia 或其他语言,Jupyter 可能更适合。

Jupyter 或 R Markdown 笔记本的替代方案


除了可作为交互式数据科学环境、便于您与同事、同行与朋友分享代码的笔记本之外,还有其他替代方案可供考虑。

因为有时您并不需要笔记本,而是需要仪表板、交互式学习平台或图书等形式。

第二部分中您已了解了 Sweave 与 Knitr 等选项。其他可选方案包括:

  • 尽管本文对 R Markdown 有一定介绍,但您应知道它还有更多用途。例如,您可以使用 flexdashboard 构建仪表板。
  • 您也可以使用 Bookdown 借助 R Markdown 快速出版 HTML、PDF、ePub 和 Kindle 电子书。
  • Shiny 也是用于创建仪表板的工具。要开始使用 Shiny,请访问此页面。
  • 在教育场景中,DataCamp Light 也可帮助您在博客或网站上创建交互式教程。若想查看 DataCamp Light 的实际效果,可参考这篇教程。

主题