如何将 R Markdown 转换为 PDF?

Posted

技术标签:

【中文标题】如何将 R Markdown 转换为 PDF?【英文标题】:How to convert R Markdown to PDF? 【发布时间】:2012-06-17 00:22:15 【问题描述】:

我之前询问过commands for converting R Markdown to html

将 R Markdown 文件转换为 PDF 文档的好方法是什么?

一个好的解决方案是尽可能多地保留内容(例如,图像、方程式、html 表格等)。该解决方案需要能够从命令行运行。一个好的解决方案还应该是跨平台的,并且理想情况下可以最大限度地减少依赖关系,以便更轻松地共享 makefile 等。

具体来说,有很多选择:

是否将RMD转MD转HTML转PDF;或 RMD 到 MD 到 PDF;或 RMD 转 PDF 如果在 R 中使用 markdown 包,需要指定哪些选项 是否使用pandoc、R 中内置的包或其他东西

这是一个示例rmd file,它可能为任何提议的解决方案提供了合理的测试。它被用作this blog post 的基础。

【问题讨论】:

我相信 pandoc 应该是最好的选择。将它构建到 R 中对我来说没有多大意义,而且我认为也不可能(它是用 Haskell 编写的)。我在这里有一些非常早期的工作:github.com/yihui/knitr-book(参见两个 shell 脚本knitmdconvert.sh)。由于 LaTeX 过于灵活,因此可能很难提出一个通用的方法; pandoc 可以使用各种模板。 什么是'R Markdown*? rstudio.com/ide/docs/r_markdown markdowntopdf.com 这个网站其实还不错。但是,没有乳胶支持 我们可以为 RStudio v1.0 更新这个答案吗? 【参考方案1】:

按照这些简单的步骤:

1:在 Rmarkdown 脚本中运行 Knit(Ctrl+Shift+K) 2:然后打开html markdown后点击在浏览器中打开(左上角)和 html 在您的网络浏览器中打开 3:然后使用Ctrl+P保存为PDF。

【讨论】:

【参考方案2】:

如果你不想安装任何东西,你可以输出 html。然后打开 html 文件 - 它应该在浏览器窗口中打开,然后右键单击打印。如果您使用的是 Mac,请在打印窗口中选择右下角的“另存为 pdf”。瞧!

【讨论】:

【参考方案3】:

更新答案(2013 年 2 月 10 日)

rmarkdown 包: 现在有一个与 Pandoc 接口的rmarkdown package available on github。 它包括一个render 函数。该文档非常清楚地说明了如何将 rmarkdown 转换为 pdf 在一系列其他格式中。这包括在 rmarkdown 文件中包含输出格式或运行向 rend 函数提供输出格式。例如,

render("input.Rmd", "pdf_document")

命令行: 当我从命令行运行 render 时(例如,使用 makefile),我有时会遇到找不到 pandoc 的问题。据推测,它不在搜索路径上。 以下答案解释了how to add pandoc to the R environment。

例如,在我运行 OSX 的计算机上,我通过 RStudio 拥有 pandoc 的副本,我可以使用以下内容:

Rscript -e "Sys.setenv(RSTUDIO_PANDOC='/Applications/RStudio.app/Contents/MacOS/pandoc');library(rmarkdown);  library(utils); render('input.Rmd', 'pdf_document')"

旧答案(大约 2012 年)

因此,许多人建议 Pandoc 是要走的路。请参阅下面的说明,了解拥有最新版本 Pandoc 的重要性。

使用 Pandoc

我使用以下命令将R Markdown 转换为HTML(即a variant of this makefile),其中RMDFILE 是没有.rmd 组件的R Markdown 文件的名称(它还假设扩展名是@987654334 @ 而不是 .Rmd)。

RMDFILE=example-r-markdown  
Rscript -e "require(knitr); require(markdown); knit('$RMDFILE.rmd', '$RMDFILE.md'); markdownToHTML('$RMDFILE.md', '$RMDFILE.html', options=c('use_xhml'))"

然后这个命令转换成pdf

Pandoc -s example-r-markdown.html -o example-r-markdown.pdf


关于这一点的几点说明: 我删除了将绘图导出到 imgur 以托管图像的示例文件中的引用。 我删除了对 imgur 上托管的图像的引用。数字似乎需要是本地的。 markdownToHTML 函数中的选项意味着图像引用指向文件而不是存储在 HTML 文件中的数据(即,我从选项列表中删除了 'base64_images')。 结果输出看起来像this。与我从浏览器将 HTML 文件打印为 pdf 文件相比,它显然制作了一个非常 LaTeX 风格的文档。

获取最新版本的 Pandoc

正如@daroczig 所述,拥有最新版本的 Pandoc 以输出 pdf 文件非常重要。在 2012 年 6 月 15 日的 Ubuntu 上,我在包管理器中一直使用 1.8.1 版的 Pandoc,但从 change log 看来,对于 pdf 支持,您至少需要 1.9+ 版的 Pandoc。

因此,我安装了caball-install。 然后跑:

cabal update
cabal install pandoc

Pandoc 安装在~/.cabal/bin/pandoc 因此,当我运行pandoc 时,它仍然看到的是旧版本。 在此处查看adding to the path。

【讨论】:

感谢您的回答。我只想评论一下,我的经验是,将 .md 文件提供给 pandoc,而不是 .html 文件,可以提供更好的输出。所以值得尝试。 这也是我最接近一个好的过程。有什么方法可以将图形文本从“plot chunk of ...”更改为其他内容? pandoc 即使在我现在已经过时的 Ubuntu 13.04 中也是 1.12 版。【参考方案4】:

只需两步:

    从这里安装最新版本的“pandoc”:

    https://github.com/jgm/pandoc/releases

    library(knitr)中调用函数pandoc

    library(knitr)
    pandoc('input.md', format = 'latex')
    

因此,您可以将“input.md”转换为“input.pdf”。

【讨论】:

【参考方案5】:

我发现使用 R studio 是最简单的方法,但是如果想从命令行进行控制,那么一个简单的 R 脚本可以使用 rmarkdown 渲染命令(如上所述)来完成。完整脚本详情here

#!/usr/bin/env R

# Render R markdown to PDF.
# Invoke with:
# > R -q -f make.R --args my_report.Rmd

# load packages
require(rmarkdown)

# require a parameter naming file to render
if (length(args) == 0) 
    stop("Error: missing file operand", call. = TRUE)
 else 
    # read report to render from command line
    for (rmd in commandArgs(trailingOnly = TRUE)) 
        # render Rmd to PDF
        if ( grepl("\\.Rmd$", rmd) && file.exists(rmd)) 
            render(rmd, pdf_document())
         else 
            print(paste("Ignoring: ", rmd))
        
    

【讨论】:

【参考方案6】:

现在(2014 年 8 月)您可以使用 RStudio 将 R Markdown 转换为 PDF。 基本上,RStudio 使用 pandoc 将 Rmd 转换为 PDF。

您可以将元数据更改为:

    添加目录 更改图形选项 更改语法高亮样式 添加 LaTeX 选项 还有更多...

更多详情-http://rmarkdown.rstudio.com/pdf_document_format.html

【讨论】:

'knit PDF' 选项在 Ubuntu 14.04、pandoc v1.17.1 中不可用。有什么需要做的设置吗? 你有什么版本的 RStudio?您是否创建了新的 rmarkdown 文件? Rstudio - v 0.98.507 让我们continue this discussion in chat. @Prradep 谈话的结果是什么?【参考方案7】:

我认为你真的需要 pandoc,这是专为这项任务设计和构建的出色软件 :) 除了 pdf,您还可以将 md 文件转换为例如docxodt 等等。

好吧,installing an up-to-date version of Pandoc 可能在 Linux 上具有挑战性(因为您需要整个 haskell-platform˙ 从源代码构建),但在 Windows/Mac 上非常容易,只需下载几兆字节。

如果你有 brewed/knitted markdown 文件,你可以在例如 bash 中调用 pandoc 或使用 R 中的 system 函数。后者的 POC 演示在 Ṗandoc.convert function of my little package 中实现(你一定很无聊,因为我试图抓住每一个机会把你的注意力放在那里)。

【讨论】:

+1 功能看起来不错;你有推荐的将 R Markdown 转换为 PDF 的单行 pandoc 命令吗? 在命令行中添加 --toc 会很有用(根据您的标题生成 nics 目录),还可以根据您的需要自定义 LaTeX 模板(例如添加 \listoffigures 和/或\listoftables 等)可能会产生精彩的文档。 apt-get install pandoc 有什么挑​​战? @sumid 您可能错过了 up-to-date 部分(好吧,如果您不使用测试)。 是的,你是对的 - 两次。我错过了它,我也在使用测试;-) 然后我认为更容易临时允许在sources.list 中进行测试并进行apt-get install -t testing pandoc 然后安装haskell-platform 和编译。 (通常我是通过实验来做到这一点的。我希望在测试中也能以同样的方式工作。)【参考方案8】:

对于看起来更像从浏览器打印时获得的选项,wkhtmltopdf 提供了一个选项。

在 Ubuntu 上

sudo apt-get install wkhtmltopdf

然后使用与 pandoc 示例相同的命令来获取 HTML:

RMDFILE=example-r-markdown  
Rscript -e "require(knitr); require(markdown); knit('$RMDFILE.rmd', '$RMDFILE.md'); markdownToHTML('$RMDFILE.md', '$RMDFILE.html', options=c('use_xhml'))"

然后

wkhtmltopdf example-r-markdown.html example-r-markdown.pdf

生成的文件看起来像this。它似乎没有处理 MathJax (this issue is discussed here),而且分页符很难看。然而,在某些情况下,这种风格可能比 LaTeX 风格的演示文稿更受欢迎。

【讨论】:

我无法在 RStudio 中运行最后一个命令。我试过system("wkhtmltopdf temp.html temp.pdf") 知道如何解决这个问题

以上是关于如何将 R Markdown 转换为 PDF?的主要内容,如果未能解决你的问题,请参考以下文章

如何把 Markdown 文件转化为 PDF

如何把 Markdown 文件转化为 PDF

如何把 Markdown 文件转化为 PDF

如何转换 Markdown + CSS -> PDF?

将 Google Colab 笔记本转换为 PDF/HTML?

如何把 Markdown 文件转化为 PDF