怎么把R Markdown转换成PDF?


127

之前,我曾问过有关将R Markdown转换为HTML命令

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

一个好的解决方案将保留尽可能多的内容(例如,图像,方程式,html表等)。该解决方案需要能够从命令行运行。一个好的解决方案也应该是跨平台,并且最好将依赖性降到最低,以使共享makefile等更容易。

具体来说,有很多选择:

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

这是一个示例rmd文件,大概可以对任何建议的解决方案提供合理的测试。它被用作本博客文章的基础。


7
我相信pandoc应该是最好的方式。对我来说,将其构建为R并没有多大意义,我也不认为这是可能的(它是用Haskell编写的)。我有一些很早就在这里工作:github.com/yihui/knitr-book(见两个shell脚本knitmdconvert.sh)。由于LaTeX太灵活,可能很难提出通用方法。您可以为pandoc使用各种模板。
Yihui Xie

什么是“ R Markdown *”?rstudio.com/ide/docs/r_markdown
Panic Panic

markdowntopdf.com这个网站实际上很好。但是,没有乳胶支持
印度尼西亚paddwan

我们可以为RStudio v1.0更新此答案吗?
Adam_G '16

Answers:


69

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

rmarkdown软件包rmarkdowngithub上现在有一个与Pandoc交互的软件包。它包括一个render功能。该文档非常清楚地说明了如何将rmarkdown转换为其他格式。这包括在rmarkdown文件中包括输出格式,或者正在为rend函数提供输出格式。例如,

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

命令行: 从命令行运行时render(例如,使用makefile),有时会遇到找不到pandoc的问题。大概它不在搜索路径上。以下答案说明了如何将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(即此makefile的变体),其中RMDFILER Markdown文件的名称不包含.rmd组件(它也假定扩展名为.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中以托管图像。
  • 我删除了对imgur上托管的图像的引用。数字似乎需要是局部的。
  • markdownToHTML函数中的选项意味着图像引用是针对文件的,而不是针对HTML文件中存储的数据的(即,我已从'base64_images'选项列表中删除)。
  • 结果输出如下所示。与从浏览器将HTML文件打印为pdf时所得到的相反,它显然是非常LaTeX风格的文档。

取得最新版本的Pandoc

正如@daroczig所提到的,拥有最新版本的Pandoc以输出pdf至关重要。自2012年6月15日起在Ubuntu上,我在软件包管理器中停留在Pandoc的1.8.1版本,但是从更改日志看来,要获得pdf支持,您至少需要1.9+的Pandoc版本。

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

cabal update
cabal install pandoc

Pandoc已安装在。~/.cabal/bin/pandoc 因此,当我运行pandoc它时,它仍然看到旧版本。请参阅此处以添加到路径


5
感谢您的回答。我只想评论一下,我的经验是将.md文件提供给pandoc而不是.html文件,可以提供更好的输出。因此值得尝试。
yoavram

这也是我完成良好流程的最接近的时间。有什么方法可以将图形文本从“ ...的绘图块”更改为其他内容?
svenski 2013年

1
pandoc即使在我现在已经过时的Ubuntu 13.04中,它的版本也为1.12。
krlmlr 2014年

22

我认为您确实需要pandoc,它是专门为该任务而设计和构建的出色软件:)除了pdf之外,您还可以将md文件转换为docxodt等。

好吧,在Linux上安装最新版本的Pandoc可能会haskell-platform遇到麻烦(因为您将需要整个˙从源代码构建),但是在Windows / Mac上只需下载几兆字节,这确实很容易。

如果您有酿造/编织的降价文件,则可以仅调用pandocbash或使用systemR中的Ṗandoc.convert函数。后者的POC演示是在我的小包装函数中实现的(在您尝试执行此操作时,您一定非常无聊)将您的注意力吸引到任何机会)。


+1功能看起来不错;您是否有推荐的一线pandoc命令将R Markdown转换为PDF?
Jeromy Anglim 2012年

1
--toc在命令行上添加将很有用(根据您的标题生成一个nics目录),并且根据您的需要自定义LaTeX模板(例如在其中添加\listoffigures和/或添加其他内容\listoftables)可能会产生精美的文档。
daroczig 2012年

3
有什么挑战apt-get install pandoc
sumid 2012年

@sumid您可能错过了最新的部分(如果您不使用测试,那么可以了)。
daroczig 2012年

是的,您是对的-两次。我错过了它,并且还在使用测试;-)然后,我认为暂时允许进行测试sources.list并进行apt-get install -t testing pandoc安装haskell-platform和编译是一件容易的事。(通常,我是通过实验来完成的。我希望测试时的工作方式相同。)
sumid 2012年

14

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

您可以将元数据更改为:

  1. 添加目录
  2. 更改图形选项
  3. 更改语法突出显示样式
  4. 添加LaTeX选项
  5. 还有很多...

有关更多详细信息-http://rmarkdown.rstudio.com/pdf_document_format.html在此处输入图片说明


1
在Ubuntu 14.04 pandoc v1.17.1中不提供'knit PDF'选项。是否需要进行任何设置?
Prradep '16

您有什么版本的RStudio?您是否创建了新的rmarkdown文件?
Jot eN

Rstudio-v 0.98.507
Prradep '16


@Prradep谈话的结果是什么?
nealmcb

10

对于一种看起来更像从浏览器打印时所得到的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样式演示文稿相比,这种样式可能更为可取。


我无法在RStudio中运行最后一个命令。我已经尝试过 system("wkhtmltopdf temp.html temp.pdf") 任何想法如何解决
Urvah Shabbir

9

仅需两个步骤:

  1. 从此处安装最新版本的“ pandoc”:

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

  2. 调用函数pandoclibrary(knitr)

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

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


3

我发现使用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))
        }
    }
}

0

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


0

请遵循以下简单步骤:

1:在Rmarkdown脚本中运行Knit(Ctrl + Shift + K)2:然后在打开html markdown之后,单击“在浏览器中打开”(左上方),然后在您的Web浏览器中打开html 3:然后使用Ctrl + P和另存为PDF。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.