如何将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
软件包 。 它包含一个render
function。 该文档使得它很清楚如何将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文件转换为docx或odt等等。
那么, 安装最新版本的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。
您可以将元数据更改为:
- 添加目录
- 更改graphics选项
- 更改语法高亮样式
- 添加乳胶选项
- 还有很多…
有关更多详细信息,请参阅http://rmarkdown.rstudio.com/pdf_document_format.html
只有两个步骤:
-
从这里安装最新版本的“pandoc”:
-
调用
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”。 瞧!