Comment convertir R Markdown en PDF?

127

J'ai déjà posé des questions sur les commandes de conversion de R Markdown en HTML .

Quel est le bon moyen de convertir des fichiers R Markdown en documents PDF?

Une bonne solution préserverait autant que possible le contenu (par exemple, des images, des équations, des tableaux html, etc.). La solution doit pouvoir être exécutée à partir de la ligne de commande. Une bonne solution serait également multiplateforme et, idéalement, minimiser les dépendances pour faciliter le partage de fichiers makefiles, etc.

Plus précisément, il existe de nombreuses options:

  • S'il faut convertir RMD en MD en HTML en PDF; ou RMD vers MD vers PDF; ou RMD en PDF
  • Si vous utilisez le markdownpackage dans R, quelles options spécifier
  • Que ce soit pour utiliser pandoc, un package intégré à R, ou autre chose

Voici un exemple de fichier rmd qui fournit vraisemblablement un test raisonnable de toute solution proposée. Il a servi de base à ce billet de blog .

Jeromy Anglim
la source
7
Je pense que le pandoc devrait être la meilleure solution. Cela n'a pas beaucoup de sens pour moi de l'intégrer dans R, et je ne pense pas que ce soit possible non plus (c'est écrit en Haskell). J'ai un travail très précoce ici: github.com/yihui/knitr-book (voir deux scripts shell knitet mdconvert.sh). Il peut être difficile de proposer une approche générale car LaTeX est trop flexible; vous pouvez utiliser toutes sortes de modèles pour pandoc.
Yihui Xie
Qu'est-ce que 'R Markdown *? rstudio.com/ide/docs/r_markdown
Colonel Panic
markdowntopdf.com ce site est plutôt bon, en fait. Cependant, il n'y a pas de support en latex
padawan
Pouvons-nous mettre à jour cette réponse pour RStudio v1.0?
Adam_G

Réponses:

69

Réponse mise à jour (10 février 2013)

Package rmarkdown : Il existe maintenant un rmarkdownpackage disponible sur github qui s'interface avec Pandoc. Il comprend une renderfonction. La documentation explique assez clairement comment convertir rmarkdown en pdf parmi une gamme d'autres formats. Cela inclut l'inclusion des formats de sortie dans le fichier rmarkdown ou l'exécution de la fourniture d'un format de sortie à la fonction de rendu. Par exemple,

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

Ligne de commande: lorsque je lance à renderpartir de la ligne de commande (par exemple, en utilisant un fichier makefile), j'ai parfois des problèmes avec pandoc introuvable. Vraisemblablement, ce n'est pas sur le chemin de recherche. La réponse suivante explique comment ajouter pandoc à l'environnement de R .

Ainsi, par exemple, sur mon ordinateur exécutant OSX, où j'ai une copie de pandoc via RStudio, je peux utiliser ce qui suit:

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

Ancienne réponse (vers 2012)

Ainsi, un certain nombre de personnes ont suggéré que Pandoc est la voie à suivre. Voir les notes ci-dessous sur l'importance d'avoir une version à jour de Pandoc.

Utilisation de Pandoc

J'ai utilisé la commande suivante pour convertir R Markdown en HTML (c'est-à-dire une variante de ce makefile ), où RMDFILEest le nom du fichier R Markdown sans le .rmdcomposant (cela suppose également que l'extension est .rmdet 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'))"

puis cette commande pour convertir en pdf

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


Quelques notes à ce sujet:

  • J'ai supprimé la référence dans le fichier d'exemple qui exporte les tracés à imgur pour héberger des images.
  • J'ai supprimé une référence à une image hébergée sur imgur. Les chiffres semblent devoir être locaux.
  • Les options de la markdownToHTMLfonction signifiaient que les références d'image sont vers des fichiers et non vers des données stockées dans le fichier HTML (c'est-à-dire que j'ai supprimé 'base64_images'de la liste d'options).
  • La sortie résultante ressemblait à ceci . Il a clairement fait un document de style très LaTeX contrairement à ce que j'obtiens si j'imprime le fichier HTML en pdf à partir d'un navigateur.

Obtenir la version à jour de Pandoc

Comme mentionné par @daroczig, il est important d'avoir une version à jour de Pandoc afin de produire des fichiers PDF. Sur Ubuntu à partir du 15 juin 2012, j'étais bloqué avec la version 1.8.1 de Pandoc dans le gestionnaire de paquets, mais il semble d'après le journal des modifications que pour le support PDF, vous avez besoin d'au moins la version 1.9+ de Pandoc.

Ainsi, j'ai installé caball-install. Et puis a couru:

cabal update
cabal install pandoc

Pandoc a été installé dans ~/.cabal/bin/pandoc Ainsi, quand j'ai couru, pandocil voyait toujours l'ancienne version. Voir ici pour ajouter au chemin .

Jeromy Anglim
la source
5
Merci pour cette réponse. Je veux juste dire que mon expérience a été que donner le fichier .md à pandoc , plutôt que le fichier .html, a donné un meilleur résultat. Cela vaut donc la peine d'expérimenter.
yoavram
C'est aussi le plus proche d'un bon processus. Existe-t-il un moyen de changer le texte de la figure de "morceau de tracé de ..." à autre chose?
svenski
1
pandocest en version 1.12 même dans mon Ubuntu 13.04 désormais obsolète.
krlmlr
22

Je pense que vous avez vraiment besoin de pandoc , quel excellent logiciel a été conçu et construit uniquement pour cette tâche :) Outre le pdf , vous pouvez convertir votre fichier md en docx ou odt, entre autres.

Eh bien, installer une version à jour de Pandoc peut être un défi sous Linux (car vous auriez besoin de tout le haskell-platform˙pour construire à partir des sources), mais vraiment facile sur Windows / Mac avec seulement quelques mégaoctets de téléchargement.

Si vous avez le fichier de démarque brassé / tricoté, vous pouvez simplement appeler pandocpar exemple bash ou avec la systemfonction dans R. Une démo POC de ce dernier est implémentée dans la Ṗandoc.convertfonction de mon petit paquet ( dont vous devez être terriblement ennuyé comme j'essaye de attirer votre attention là-bas à chaque occasion ).

Daroczig
la source
+1 La fonction semble bonne; Avez-vous une commande pandoc one-liner recommandée pour convertir R Markdown en PDF?
Jeromy Anglim
1
L'ajout --tocserait utile sur la ligne de commande (résultant en une table de contenu Nics basée sur vos en-têtes) et la personnalisation du modèle LaTeX pour vos besoins (comme l'ajout ici \listoffigureset / ou \listoftablesetc.) pourrait entraîner de merveilleux documents.
daroczig
3
Quel défi apt-get install pandoc?
sumid
@sumid vous avez peut-être manqué la partie mise à jour (enfin, si vous n'utilisez pas testing).
daroczig
Ouais tu as raison - deux fois. Je l'ai manqué et j'utilise également testing ;-) Ensuite, je perçois comme temporaire plus facile de permettre des tests sources.listet de faire apt-get install -t testing pandocensuite l'installation haskell-platformet la compilation. (Habituellement, je fais cela avec expérimental. J'espère que cela fonctionne de la même manière dans les tests.)
sumid
14

En ce moment (août 2014) Vous pouvez utiliser RStudio pour convertir R Markdown en PDF. Fondamentalement, RStudio utilise pandoc pour convertir Rmd en PDF.

Vous pouvez modifier les métadonnées en:

  1. Ajouter une table des matières
  2. Modifier les options de la figure
  3. Modifier le style de mise en évidence de la syntaxe
  4. Ajouter des options LaTeX
  5. Et beaucoup plus...

Pour plus de détails - http://rmarkdown.rstudio.com/pdf_document_format.htmlentrez la description de l'image ici

Jot eN
la source
1
L'option 'knit PDF' n'est pas disponible dans Ubuntu 14.04, pandoc v1.17.1. Y a-t-il des réglages à faire?
Prradep
Quelle version de RStudio avez-vous? Avez-vous créé un nouveau fichier rmarkdown?
Notez eN le
Rstudio - v 0.98.507
Prradep
Continuons cette discussion dans le chat .
Prradep
@Prradep Quel a été le résultat de la conversation?
nealmcb
10

Pour une option qui ressemble plus à ce que vous obtenez lorsque vous imprimez à partir d'un navigateur, wkhtmltopdffournit une option.

Sur Ubuntu

sudo apt-get install wkhtmltopdf

Et puis la même commande que pour l'exemple pandoc pour accéder au 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'))"

puis

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

Le fichier résultant ressemblait à ceci . Il ne semblait pas gérer le MathJax ( ce problème est discuté ici ), et les sauts de page sont laids. Cependant, dans certains cas, un tel style peut être préféré à une présentation de style LaTeX.

Jeromy Anglim
la source
Je ne parviens pas à exécuter la dernière commande dans RStudio. J'ai essayé system("wkhtmltopdf temp.html temp.pdf") toute idée de comment résoudre ce problème
Urvah Shabbir
9

Seulement deux étapes:

  1. Installez la dernière version "pandoc" à partir d'ici:

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

  2. Appelez la fonction pandocdans lelibrary(knitr)

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

Ainsi, vous pouvez convertir votre "input.md" en "input.pdf".

Wei
la source
3

J'ai trouvé le moyen le plus simple d'utiliser R studio, mais si vous souhaitez contrôler à partir de la ligne de commande, un simple script R peut faire l'affaire en utilisant la commande rmarkdown render (comme mentionné ci-dessus). Détails complets du script ici

#!/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))
        }
    }
}
Frank Jung
la source
0

Si vous ne voulez rien installer, vous pouvez générer du HTML. Ensuite, ouvrez le fichier html - il devrait s'ouvrir dans une fenêtre de navigateur, puis cliquez avec le bouton droit pour imprimer. Dans la fenêtre d'impression, sélectionnez "enregistrer au format pdf" dans le coin inférieur droit si vous êtes sur un Mac. Voila!

Mariah Akinbi
la source
0

Suivez ces étapes simples:

1: Dans le script Rmarkdown, exécutez Knit (Ctrl + Shift + K) 2: Ensuite, après l'ouverture du markdown html, cliquez sur Ouvrir dans le navigateur (en haut à gauche) et le html est ouvert dans votre navigateur Web 3: utilisez ensuite Ctrl + P et enregistrer au format PDF.

Ankit Kamboj
la source