Como converter R Markdown para PDF?


127

Eu já perguntei sobre os comandos para converter R Markdown em HTML .

Qual é uma boa maneira de converter arquivos R Markdown em documentos PDF?

Uma boa solução preservaria o máximo possível do conteúdo (por exemplo, imagens, equações, tabelas html, etc.). A solução precisa poder ser executada na linha de comando. Uma boa solução também seria multiplataforma e, idealmente, minimizará dependências para facilitar o compartilhamento de makefiles e assim por diante.

Especificamente, existem muitas opções:

  • Se é necessário converter RMD para MD em HTML para PDF; ou RMD para MD para PDF; ou RMD para PDF
  • Se estiver usando o markdownpacote em R, quais opções especificar
  • Se usar pandoc, um pacote incorporado ao R ou outra coisa

Aqui está um exemplo de arquivo rmd que, presumivelmente, fornece um teste razoável de qualquer solução proposta. Foi usado como base para esta postagem no blog .


7
Acredito que o pandoc deve ser o melhor caminho a percorrer. Não faz muito sentido para mim construí-lo no R, e também não acho que seja possível (está escrito em Haskell). Tenho alguns trabalhos muito antigos aqui: github.com/yihui/knitr-book (veja dois scripts de shell knite mdconvert.sh). Pode ser difícil apresentar uma abordagem geral, já que o LaTeX é muito flexível; você pode usar todos os tipos de modelos para o pandoc.
Yihui Xie


markdowntopdf.com este site é muito bom, na verdade. No entanto, não há suporte de látex
padawan

Podemos atualizar esta resposta para o RStudio v1.0?
Adam_G

Respostas:


69

Resposta atualizada (10 de fevereiro de 2013)

Pacote rmarkdown : Agora existe um rmarkdownpacote disponível no github que faz interface com o Pandoc. Inclui uma renderfunção. A documentação deixa bem claro como converter rmarkdown em pdf entre vários outros formatos. Isso inclui a inclusão de formatos de saída no arquivo rmarkdown ou a execução de um formato de saída para a função de renderização. Por exemplo,

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

Linha de comando: Quando corro a renderpartir da linha de comando (por exemplo, usando um makefile), às vezes tenho problemas com o pandoc não sendo encontrado. Presumivelmente, ele não está no caminho de pesquisa. A resposta a seguir explica como adicionar pandoc ao meio ambiente R .

Por exemplo, no meu computador executando o OSX, onde tenho uma cópia do pandoc através do RStudio, posso usar o seguinte:

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

Resposta antiga (por volta de 2012)

Assim, várias pessoas sugeriram que Pandoc é o caminho a percorrer. Veja as notas abaixo sobre a importância de ter uma versão atualizada do Pandoc.

Usando Pandoc

Eu usei o seguinte comando para converter R Markdown em HTML (ou seja, uma variante desse makefile ), onde RMDFILEé o nome do arquivo R Markdown sem o .rmdcomponente (ele também assume que a extensão é .rmde não .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'))"

e então este comando para converter para pdf

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


Algumas notas sobre isso:

  • Eu removi a referência no arquivo de exemplo que exporta plotagens para imgur para hospedar imagens.
  • Eu removi uma referência a uma imagem que estava hospedada no imgur. Os números parecem precisar ser locais.
  • As opções na markdownToHTMLfunção significavam que as referências de imagem são para arquivos e não para dados armazenados no arquivo HTML (ou seja, eu removi 'base64_images'da lista de opções).
  • A saída resultante parecia ser este . Claramente, criou um documento no estilo LaTeX, em contraste com o que recebo se imprimir o arquivo HTML em pdf a partir de um navegador.

Obtendo a versão atualizada do Pandoc

Conforme mencionado por @daroczig, é importante ter uma versão atualizada do Pandoc para gerar PDFs. No Ubuntu, a partir de 15 de junho de 2012, eu estava preso à versão 1.8.1 do Pandoc no gerenciador de pacotes, mas parece que, no log de alterações, para o suporte ao pdf, você precisa pelo menos da versão 1.9+ do Pandoc.

Assim, eu instalei caball-install. E então correu:

cabal update
cabal install pandoc

Pandoc foi instalado em ~/.cabal/bin/pandoc Assim, quando eu corri pandoc, ainda estava vendo a versão antiga. Veja aqui para adicionar ao caminho .


5
Obrigado por esta resposta. Eu só quero comentar que minha experiência foi que dar o arquivo .md ao pandoc , em vez do arquivo .html, deu uma saída melhor. Então vale a pena experimentar.
yoavram

Este é o mais próximo que cheguei de um bom processo também. Existe alguma maneira de alterar o texto da figura de "parte da trama de ..." para outra coisa?
svenski

1
pandocestá na versão 1.12, mesmo no meu Ubuntu 13.04, agora desatualizado.
precisa saber é o seguinte

22

Eu acho que você realmente precisa do pandoc , que software excelente foi projetado e construído apenas para esta tarefa :) Além do pdf , você pode converter seu arquivo md em, por exemplo, docx ou odt, entre outros.

Bem, a instalação de uma versão atualizada do Pandoc pode ser desafiadora no Linux (como você precisaria de toda a haskell-platformcompilação a partir das fontes), mas muito fácil no Windows / Mac com apenas alguns megabytes de download.

Se você possui o arquivo de marcação de malha / malha, basta chamar, pandocpor exemplo, bash ou com a systemfunção dentro de R. Uma demonstração POC desse último é implementada na Ṗandoc.convertfunção do meu pequeno pacote (do qual você deve estar muito entediado enquanto tento aponte sua atenção para lá em todas as oportunidades ).


+1 A função parece ser boa; Você tem um comando pandoc de uma linha recomendado para converter R Markdown em PDF?
Jeromy Anglim 15/06/12

1
Adicionar --tocseria útil na linha de comando (resultando em uma tabela de conteúdo da placa de rede com base em seus títulos) e também personalizar o modelo do LaTeX para suas necessidades (como adicionar lá \listoffigurese / ou \listoftablesetc.) pode resultar em documentos maravilhosos.
daroczig

3
O que é um desafio apt-get install pandoc?
sumid 23/11/12

@sumid, você pode ter perdido a parte atualizada (bem, se você não estiver usando o teste).
21412 daroczig

Sim, você está certo - duas vezes. Eu senti falta disso e também estou usando o teste ;-) Então percebo como temporário mais fácil permitir o teste sources.liste a apt-get install -t testing pandocinstalação haskell-platforme a compilação. (Normalmente eu faço isso com experimental eu espero é funciona da mesma maneira em testar..)
sumid

14

Agora (agosto de 2014) Você pode usar o RStudio para converter R Markdown em PDF. Basicamente, o RStudio usa o pandoc para converter Rmd em PDF.

Você pode alterar os metadados para:

  1. Adicionar sumário
  2. Alterar opções de figura
  3. Alterar estilo de destaque da sintaxe
  4. Adicionar opções do LaTeX
  5. E muitos mais...

Para mais detalhes - http://rmarkdown.rstudio.com/pdf_document_format.htmlinsira a descrição da imagem aqui


1
A opção 'knit PDF' não está disponível no Ubuntu 14.04, pandoc v1.17.1. Há alguma configuração que precisa ser feita?
Prradep 8/07

Qual versão do RStudio você possui? Você criou um novo arquivo rmarkdown?
Jot eN

Rstudio - v 0.98.507
Prradep 08/07/16


@Prradep Qual foi o resultado da conversa?
Nealmcb

10

Para uma opção que se parece mais com o que você obtém ao imprimir em um navegador, wkhtmltopdfoferece uma opção.

No Ubuntu

sudo apt-get install wkhtmltopdf

E então o mesmo comando do exemplo pandoc para chegar ao 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'))"

e depois

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

O arquivo resultante parecia ser este . Não parecia lidar com o MathJax ( esse problema é discutido aqui ) e as quebras de página são feias. No entanto, em alguns casos, esse estilo pode ser preferido em relação a uma apresentação mais no estilo LaTeX.


Não consigo executar o último comando no RStudio. Eu tentei system("wkhtmltopdf temp.html temp.pdf") Alguma idéia de como consertar isso
Urvah Shabbir

9

Apenas duas etapas:

  1. Instale a versão mais recente "pandoc" a partir daqui:

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

  2. Chame a função pandocnolibrary(knitr)

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

Assim, você pode converter seu "input.md" em "input.pdf".


3

Eu achei o uso do R studio da maneira mais fácil, mas se você quiser controlar a partir da linha de comando, um script R simples pode executar o truque usando o comando rmarkdown render (como mencionado acima). Detalhes completos do script aqui

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

Se você não deseja instalar nada, pode gerar html. Em seguida, abra o arquivo html - ele deve abrir em uma janela do navegador e clique com o botão direito do mouse para imprimir. Na janela de impressão, selecione "Salvar como PDF" no canto inferior direito, se você estiver em um Mac. Voila!


0

Siga estes passos simples:

1: No script Rmarkdown, execute Knit (Ctrl + Shift + K) 2: Depois que a marcação html for aberta, clique em Abrir no navegador (canto superior esquerdo) e o html será aberto no navegador da web 3: Em seguida, use Ctrl + P e salve como PDF.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.