Come convertire R Markdown in PDF?


127

In precedenza ho chiesto informazioni sui comandi per convertire R Markdown in HTML .

Qual è un buon modo per convertire i file R Markdown in documenti PDF?

Una buona soluzione preserverebbe il più possibile il contenuto (ad es. Immagini, equazioni, tabelle html, ecc.). La soluzione deve poter essere eseguita dalla riga di comando. Una buona soluzione sarebbe anche multipiattaforma e idealmente minimizzare le dipendenze per facilitare la condivisione dei makefile e così via.

In particolare, ci sono molte opzioni:

  • Se convertire RMD in MD in HTML in PDF; o da RMD a MD in PDF; o da RMD a PDF
  • Se si utilizza il markdownpacchetto in R, quali opzioni specificare
  • Se usare pandoc, un pacchetto integrato in R o qualcos'altro

Ecco un esempio di file rmd che presumibilmente fornisce un test ragionevole di qualsiasi soluzione proposta. È stato usato come base per questo post sul blog .


7
Credo che il pandoc dovrebbe essere il modo migliore per andare. Non ha molto senso per me costruirlo in R, e non credo sia nemmeno possibile (è scritto in Haskell). Ho alcuni lavori molto precoci qui: github.com/yihui/knitr-book (vedere due script di shell knite mdconvert.sh). Potrebbe essere difficile trovare un approccio generale poiché LaTeX è troppo flessibile; puoi usare tutti i tipi di template per pandoc.
Yihui Xie,


markdowntopdf.com questo sito è abbastanza buono, in realtà. Tuttavia, non esiste supporto in lattice
padawan,

Possiamo aggiornare questa risposta per RStudio v1.0?
Adam_G

Risposte:


69

Risposta aggiornata (10 feb 2013)

pacchetto rmarkdown : ora c'è un rmarkdownpacchetto disponibile su github che si interfaccia con Pandoc. Include una renderfunzione. La documentazione rende abbastanza chiaro come convertire rmarkdown in pdf tra una vasta gamma di altri formati. Ciò include l'inclusione dei formati di output nel file rmarkdown o l'esecuzione di un formato di output per la funzione rend. Per esempio,

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

Riga di comando: quando corro renderdalla riga di comando (ad esempio, usando un makefile), a volte ho problemi con pandoc che non viene trovato. Presumibilmente, non è sul percorso di ricerca. La risposta che segue spiega come aggiungere Pandoc per l'ambiente R .

Ad esempio, sul mio computer che esegue OSX, dove ho una copia di Pandoc tramite RStudio, posso usare quanto segue:

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

Vecchia risposta (circa 2012)

Quindi, un certo numero di persone ha suggerito che Pandoc è la strada da percorrere. Vedi le note seguenti sull'importanza di disporre di una versione aggiornata di Pandoc.

Usando Pandoc

Ho usato il seguente comando per convertire R Markdown in HTML (cioè una variante di questo makefile ), dove RMDFILEè il nome del file R Markdown senza il .rmdcomponente (presuppone anche che l'estensione sia .rmde non .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 quindi questo comando per convertire in pdf

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


Alcune note a riguardo:

  • Ho rimosso il riferimento nel file di esempio che esporta grafici in imgur per ospitare immagini.
  • Ho rimosso un riferimento a un'immagine ospitata su imgur. Le figure sembrano aver bisogno di essere locali.
  • Le opzioni nella markdownToHTMLfunzione significavano che i riferimenti alle immagini sono relativi ai file e non ai dati memorizzati nel file HTML (ovvero, ho rimosso 'base64_images'dall'elenco delle opzioni).
  • L'output risultante sembrava questo . Ha chiaramente creato un documento in stile LaTeX in contrasto con quello che ottengo se stampo il file HTML in pdf da un browser.

Ottenere la versione aggiornata di Pandoc

Come accennato da @daroczig, è importante disporre di una versione aggiornata di Pandoc per la produzione di pdf. Su Ubuntu dal 15 giugno 2012, ero bloccato con la versione 1.8.1 di Pandoc nel gestore dei pacchetti, ma dal registro delle modifiche sembra che per il supporto pdf sia necessaria almeno la versione 1.9+ di Pandoc.

Quindi ho installato caball-install. E poi corse:

cabal update
cabal install pandoc

Pandoc è stato installato in ~/.cabal/bin/pandoc Così, quando ho funzionato pandoc, stava ancora vedendo la vecchia versione. Vedi qui per l' aggiunta al percorso .


5
Grazie per questa risposta Voglio solo commentare che la mia esperienza è stata che dare il file .md a pandoc , anziché il file .html, ha prodotto un risultato migliore. Quindi vale la pena sperimentare.
yoavram,

Questo è il più vicino anche a un buon processo. C'è un modo per cambiare il testo della figura da "trama pezzo di ..." a qualcos'altro?
svenski,

1
pandocè nella versione 1.12 anche nel mio Ubuntu 13.04 ormai obsoleto.
krlmlr

22

Penso che tu abbia davvero bisogno di pandoc , un ottimo software progettato e realizzato proprio per questo compito :) Oltre al pdf , potresti convertire il tuo file md in eg docx o odt tra gli altri.

Bene, l' installazione di una versione aggiornata di Pandoc potrebbe essere una sfida su Linux (dato che avresti bisogno dell'intero haskell-platform˙ per compilare dalle fonti), ma molto semplice su Windows / Mac con solo pochi megabyte di download.

Se hai il file markdown preparato / lavorato a maglia puoi semplicemente chiamare pandocad esempio bash o con la systemfunzione all'interno di R. Una demo POC di quest'ultimo è implementata nella Ṗandoc.convertfunzione del mio piccolo pacchetto (di cui devi essere terribilmente annoiato mentre provo a punta la tua attenzione lì in ogni occasione ).


+1 La funzione sembra buona; Hai un comando pandoc one-liner consigliato per convertire R Markdown in PDF?
Jeromy Anglim,

1
L'aggiunta --tocsarebbe utile sulla riga di comando (risultante in una tabella di contenuti di nicchia basata sui titoli) e anche la personalizzazione del modello LaTeX per le tue esigenze (come l'aggiunta di lì \listoffigurese / o \listoftablesecc.) Potrebbe risultare in documenti meravigliosi.
daroczig,

3
Di che sfida apt-get install pandoc?
somma del

@sumid potresti aver perso la parte aggiornata (beh, se non stai usando i test).
daroczig,

Sì, hai ragione, due volte. Mi è mancato e sto anche usando i test ;-) Quindi percepisco come più semplice temporaneo consentire i test sources.liste fare apt-get install -t testing pandocquindi l'installazione haskell-platforme la compilazione. (Di solito lo faccio con sperimentale. Spero che
funzioni

14

In questo momento (agosto 2014) è possibile utilizzare RStudio per convertire R Markdown in PDF. Fondamentalmente, RStudio usa pandoc per convertire Rmd in PDF.

Puoi modificare i metadati in:

  1. Aggiungi sommario
  2. Cambia le opzioni delle figure
  3. Cambia lo stile di evidenziazione della sintassi
  4. Aggiungi opzioni LaTeX
  5. E molti altri...

Per maggiori dettagli: http://rmarkdown.rstudio.com/pdf_document_format.htmlinserisci qui la descrizione dell'immagine


1
L'opzione 'knit PDF' non è disponibile in Ubuntu 14.04, pandoc v1.17.1. C'è qualche impostazione da fare?
Prradep,

Quale versione di RStudio hai? Hai creato un nuovo file di rmarkdown?
Jot eN

Rstudio - v 0.98.507
Prradep


@Prradep Qual è stato il risultato della conversazione?
nealmcb,

10

Per un'opzione che assomiglia di più a ciò che si ottiene quando si stampa da un browser, wkhtmltopdffornisce un'opzione.

Su Ubuntu

sudo apt-get install wkhtmltopdf

E poi lo stesso comando dell'esempio pandoc per arrivare all'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 poi

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

Il file risultante sembrava questo . Non sembrava gestire MathJax ( questo problema è discusso qui ) e le interruzioni di pagina sono brutte. Tuttavia, in alcuni casi, un tale stile potrebbe essere preferito rispetto a una presentazione più in stile LaTeX.


Non riesco a eseguire l'ultimo comando in RStudio. Ho provato system("wkhtmltopdf temp.html temp.pdf") qualsiasi idea su come risolvere il problema
Urvah Shabbir,

9

Solo due passaggi:

  1. Installa l'ultima versione "pandoc" da qui:

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

  2. Chiamare la funzione pandocinlibrary(knitr)

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

Pertanto, è possibile convertire "input.md" in "input.pdf".


3

Ho trovato l'uso di R studio nel modo più semplice, ma se si desidera controllare dalla riga di comando, un semplice script R può fare il trucco usando il comando rmarkdown render (come detto sopra). Dettagli di script completi qui

#!/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 non si desidera installare nulla, è possibile generare HTML. Quindi apri il file html: dovrebbe aprirsi in una finestra del browser, quindi fai clic con il pulsante destro del mouse per stampare. Nella finestra di stampa, seleziona "salva come pdf" nell'angolo in basso a destra se sei su un Mac. Ecco!


0

Segui questi semplici passaggi:

1: nello script Rmarkdown esegui Knit (Ctrl + Shift + K) 2: Quindi dopo che è stato aperto il markdown html fai clic su Apri nel browser (in alto a sinistra) e l'html viene aperto nel tuo browser 3: Quindi usa Ctrl + P e salva come PDF.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.