R Markdown、Knitr、Pandoc和Bookdown之间的关系
Posted
技术标签:
【中文标题】R Markdown、Knitr、Pandoc和Bookdown之间的关系【英文标题】:Relationship between R Markdown, Knitr, Pandoc, and Bookdown 【发布时间】:2017-03-26 14:22:31 【问题描述】:R Markdown、Knitr、Pandoc、Bookdown的功能是什么关系?
在将带有嵌入式 R 代码(例如 .Rnw
或 .Rmd
)的标记文档转换为最终输出(例如 .pdf
或 .html
)时,这些包之间的“分工”具体是什么?而如果使用 Knitr 处理 RMarkdown,rmarkdown
包有什么作用,与markdown package
有什么不同?
【问题讨论】:
【参考方案1】:潘多克
Pandoc 是一个文档转换器。它可以从许多不同的标记格式转换为许多其他格式,例如.doc
、.pdf
等。
Pandoc 是一个没有 GUI 的命令行工具。它是独立于 R 的独立软件。但是,它与 R Studio 捆绑在一起,因为rmarkdown
依赖它进行文档转换。
Pandoc 不仅可以转换文档,而且还在基本 Markdown 语言之上添加功能,使其能够支持更复杂的输出。
R 降价
R Markdown 是基于 Markdown 的:
Markdown(标记语言)
Markdown 是一种轻量级标记语言,具有纯文本格式语法,旨在将其转换为 HTML 和许多其他格式。 Markdown 文件是一个纯文本文件,通常以.md
为扩展名。
与 HTML 和 Latex 等其他标记语言一样,它完全独立于 R。
没有明确定义的 Markdown 标准。这导致了碎片化,因为不同的供应商编写自己的语言变体来纠正缺陷或添加缺失的功能。
Markdown(R 包)
markdown
是一个将.Rmd
文件转换为 HTML 的 R 包。它是rmarkdown
的前身,提供了更多的功能。不再推荐使用。
R Markdown(标记语言)
R Markdown 是 markdown 语法的扩展。 R Markdown 文件是纯文本文件,通常具有文件扩展名.Rmd
。它们是使用 markdown 语法的扩展编写的,使 R 代码能够以以后可以执行的方式嵌入其中。
因为它们预计会被rmarkdown
包处理,所以可以将Pandoc markdown syntax 用作R 降价文件的一部分。这是对原始 Markdown 语法的扩展,可提供原始 HTML/Latex 和表格等附加功能。
R Markdown(包)
R 包rmarkdown
是一个库,可处理.Rmd
文件并将其转换为多种不同格式。
核心函数是rmarkdown::render
,其中stands on the shoulders of pandoc。这个函数'renders the input file to the specified output format using pandoc. If the input requires knitting then knitr::knit
is called prior to pandoc.
RMarkdown 包的目标就是to provide reasonably good defaults and an R-friendly interface to customize Pandoc options.。
在 RMarkdown 文件顶部看到的 YAML 元数据专门用于将选项传递给 rmarkdown::render
,以指导构建过程。
请注意,RMarkdown 仅处理 markdown 语法。如果要转换.Rhtml
或.Rnw
文件,应使用Knitr
内置的便捷函数,如knitr::knit2html
和knitr:knit2pdf
针织衫
Knitr 采用嵌入代码的纯文本文档,执行代码并将结果“编织”回文档中。
例如,它转换
将R Markdown (.Rmd
) 文件转换为标准降价文件 (.md
)
.Rnw
(Sweave) 文件转换为 .tex
格式。
将.Rhtml
文件转换为 html。
核心函数是knitr::knit
,默认情况下,它会查看输入文档并尝试猜测它是什么类型 - Rnw、Rmd 等。
这个核心功能扮演三个角色:
- 源解析器,它查看输入文档并检测哪些部分是用户想要评估的代码。
- 代码评估器,用于评估此代码
- 输出渲染器,它将评估结果以原始输出类型可解释的格式写回文档。例如,如果输入文件是.Rmd
,则输出渲染会以.md
格式标记代码评估的输出。
文档格式之间的转换
Knitr不在文档格式之间进行转换 - 例如将 .md
转换为 .html
。但是,它确实提供了一些便利功能来帮助您使用其他库来执行此操作。 如果您使用的是rmarkdown
包,则应忽略此功能,因为它已被rmarkdown::render
取代。
一个例子是knitr:knit2pdf
,它将:'Knit the input Rnw or Rrst document, and compile to PDF using texi2pdf or rst2pdf'.
一个潜在的混淆来源是knitr::knit2html
,"is a convenience function to knit the input markdown source and call markdown::markdownToHTML
to convert the result to HTML." 现在是遗留功能,因为markdown
包已被rmarkdown
包取代。见this note。
预订
bookdown 包建立在 R Markdown 之上,继承了 Markdown 语法的简单性,以及多种输出格式(PDF/HTML/Word/...)的可能性。
它提供了多页 HTML 输出、编号和交叉引用图形/表格/部分/方程式、插入部分/附录以及导入 GitBook 样式 (https://www.gitbook.com) 等功能,以创建优雅和吸引人的 HTML 书页。
【讨论】:
我觉得这很令人困惑,所以我在这里尽了最大努力。如果我有问题,请编辑或添加不同的答案... 我觉得令人困惑的一个方面是传递给工具链每个步骤的参数的文档。几乎没有交互式帮助(例如自动补全),人们必须猜测应该在 yaml 标头中调用哪些参数,或者通过knitr_opts
(我总是忘记它叫什么),或者通过自定义 pandoc 参数,或者通过其他 yam 文件,或自定义 pandoc 模板...有时感觉有点丛林,尤其是当您将 LaTeX 添加到链中时。
@baptiste 我完全同意。这正是我更喜欢带有裸 LaTeX 的 RNW 文档的原因。没有中间的pandoc
步骤,减少魔法,减少混乱。只是公认的陡峭的 LaTeX 学习曲线。在我看来,当您对简单的默认内容感到满意时,Rmarkdown 非常棒。但是,一旦您必须对其进行调整,复杂性就会迅速增加。
这是我找到的最好的解释。对于初学者甚至像我这样在 R 和 Latex 方面有多年经验的人来说,这非常令人困惑。很棒的帖子。
@StatsStudent 我认为 rstudio rmarkdown 备忘单的早期版本有一个图表,它非常有助于理解从 rmarkdown 创建输出的不同步骤。也许这里的答案可以用图表来做?以上是关于R Markdown、Knitr、Pandoc和Bookdown之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
使用 knitr、Rmarkdown 和 pandoc 创建 HTML 幻灯片
使用 pandoc 从 Markdown 转换为 PDF 时设置边距大小
使用 KnitR 以编程方式在 R 中创建 Markdown 表