如何将R Markdown转换为PDF?

我以前曾问过将R Markdown转换为HTML的命令 。

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

一个好的解决scheme将尽可能地保留内容(例如图像,公式,html表格等)。 该解决scheme需要能够从命令行运行。 一个好的解决scheme也将是跨平台的,理想情况下最小化依赖关系,以便更容易地共享makefile等等。

具体来说,有很多select:

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

这里是一个rmd文件的例子,它可以提供任何build议的解决scheme的合理testing。 它被用作这篇博文的基础。

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

rmarkdown软件包 :现在在github上有一个与Pandoc交互的rmarkdown软件包 。 它包含一个renderfunction。 该文档使得它很清楚如何将rmarkdown转换为一系列其他格式的pdf。 这包括在rmarkdown文件中包含输出格式,或者运行将输出格式提供给rend函数。 例如,

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

命令行:当我从命令行运行render (例如,使用makefile)时,我有时会遇到无法findpandoc的问题。 据推测,这不是在searchpath。 以下答案解释了如何将pandoc添加到R环境 。

例如,在运行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(即, 此生成文件的变体 ),其中RMDFILE是没有.rmd组件的R Markdown文件的名称(它也假定扩展名是.rmd而不是.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上托pipe的图像的引用。 数字似乎需要是本地的。
  • markdownToHTML函数中的选项意味着图像引用是文件而不是存储在HTML文件中的数据(即,我从选项列表中删除了'base64_images' )。
  • 结果输出如下所示 。 如果我从浏览器打印HTML文件到PDF文件,它显然已经做出了一个非常类似LaTeX的文档。

获取最新版本的Pandoc

正如@daroczig所提到的,为了输出pdf文件,有一个最新版本的Pandoc是非常重要的。 在Ubuntu上,截至2012年6月15日,我在包pipe理器中遇到了Pandoc版本1.8.1,但是从更改日志看来,对于pdf支持,您至less需要版本1.9+的Pandoc。

于是,我安装了caball-install 。 然后跑:

 cabal update cabal install pandoc 

Pandoc安装在~/.cabal/bin/pandoc所以当我运行pandoc时候仍然看到旧版本。 看到这里添加到path 。

我认为你真的需要pandoc ,这个伟大的软件是为这个任务而devise和构build的:)除了pdf ,你可以将你的md文件转换为docxodt等等。

那么, 安装最新版本的Pandoc可能会在Linux haskell-platform引发争议(因为您需要从源代码构build完整的haskell-platform ),但是在Windows / Mac上只需要几兆字节的下载就可以轻松实现。

如果你有pandoc / knitted markdown文件,你可以在例如bash中使用pandoc或者在R中使用system函数。后者的POC演示是在我的小软件包的' Ṗandoc.convert函数中实现的( 你必须非常无聊因为我试图在每一个机会上指出你的注意力 )。

对于一个看起来更像从浏览器打印时所得到的选项, 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 

生成的文件看起来像这样 。 它似乎没有处理MathJax( 这个问题在这里讨论 ),分页是丑陋的。 但是,在某些情况下,这种风格可能比LaTeX风格的performance更受欢迎。

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

您可以将元数据更改为:

  1. 添加目录
  2. 更改graphics选项
  3. 更改语法高亮样式
  4. 添加乳胶选项
  5. 还有很多…

有关更多详细信息,请参阅http://rmarkdown.rstudio.com/pdf_document_format.html 在这里输入图像说明

只有两个步骤:

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

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

  2. 调用library(knitr)的函数pandoc library(knitr)

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

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

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

 #!/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)) } } } 

如果你不想安装任何你可以输出的HTML。 然后打开html文件 – 它应该在浏览器窗口中打开,然后右键单击打印。 在打印窗口中,如果您在Mac上,请select右下angular的“另存为pdf”。 瞧!