web-dev-qa-db-fra.com

R Markdown - nom de sortie variable

Avec un fichier de démarque R, je voudrais créer différents documents PDF de sortie possibles, où le nom du fichier de sortie doit être défini dans le document. Existe-t-il un moyen de convaincre le markdown de manipuler le nom de fichier de sortie de cette manière? Idéalement, je voudrais passer le nom de fichier par un morceau r.

27
Sosel

Vous pouvez conserver la simplicité d'utilisation du bouton RStudio Knit et la reproductibilité d'un en-tête YAML en utilisant le crochet non documenté knit pour redéfinir ce que fait le bouton (la fonction par défaut appelée est rmarkdown::render ). Le paramètre output_file De la fonction de rendu spécifie le nom du fichier. Ainsi, en le définissant, vous remplacez le comportement standard consistant à utiliser le même préfixe que le nom de fichier d'entrée.

par exemple. pour toujours afficher un fichier appelé monfichier.pdf

knit: (function(inputFile, encoding) { rmarkdown::render(inputFile, encoding = encoding, output_file = file.path(dirname(inputFile), 'myfile.pdf')) })

La fonction peut être un one-liner anonyme aussi bien qu'importé à partir d'un paquet, comme vu ici avec slidify .

Vous pouvez définir vos propres en-têtes YAML (je ne sais pas si cela est généralement conseillé de toute façon), accessibles sous rmarkdown::metadata$newheader Mais ils ne semblent pas disponibles à partir de ce type de fonction pour autant que je puisse voir.

Quant à la transmission du nom de fichier à partir d'un morceau R ... si vous faites référence à des morceaux de code sous l'en-tête YAML, d'après mon expérience, je ne pense pas que ce soit possible (?). Les en-têtes peuvent contenir des commandes R en ligne (simples insérées dans un crochet, commençant par r), mais apparemment pas pour cette fonction de hook.

Connexes :

35
Louis Maddox

C'est à peu près ce que je fais:

rmarkdown::render('my_markdown_report.Rmd',
                  output_file = paste('report.', Sys.Date(), 
                                      '.pdf', sep=''))

J'ai trois scripts - l'un extrait les données et les traite, le second crée des graphiques et des tableaux pour le rapport. Le troisième crée un rapport basé sur le fichier de démarque. Le code que vous voyez ci-dessus fait partie du troisième script

22
ilya

Suite à ce que @ilya a écrit, cette page Web a un excellent exemple démontrant ce qu'ils décrivent, à savoir comment créer plusieurs rapports reproductibles à partir du même document .Rmd:

http://www.reed.edu/data-at-reed/software/R/markdown_multiple_reports.html

La page Web utilise deux scripts, un script R et un script Rmarkdown pour créer plusieurs rapports. Je l'ai utilisé comme modèle pour mon propre travail et l'ai trouvé très utile.

4
K Bro

Ma meilleure solution (jusqu'à présent)

voir l'histoire complète sur la pile

J'ai joué avec le crochet Knitr sans bien comprendre comment il fonctionne et j'ai rencontré une solution de contournement laide. Le codage ci-dessous semble faire l'affaire. Ce serait bien si quelqu'un peut expliquer pourquoi cela fonctionne et/ou s'il peut être écrit moins laid.

Pour l'instant, j'ai perdu l'écran de saisie brillant, mais je pense que cela peut même être ajouté plus tard. La bonne chose est que le bouton R-Studio Knit peut toujours être utilisé.

Veuillez noter que le sous-titre et le nom de fichier sont tous les deux: Cela fonctionne! même avec espace et point d'exclamation. Le fichier est enregistré sous Cela fonctionne! .Pdf

Le nom de fichier et le sous-titre sont définis en affectant le texte à l'objet pSubTitle. Notez que les paramètres sont toujours dans le YAML mais ne donnent pas lieu à un écran contextuel brillant car ils sont attribués dans le crochet Knitr

enter image description here

---
params: 
  sub_title:
    input: text
    label: Sub Title
    value: 'my_Sub_Title_and_File_Name'
title    : "Parameterized_Title_and_output_file"
subtitle : "`r params$sub_title`"
output:
  pdf_document:
    keep_tex: false
knit: (
  function(inputFile, encoding) { 

    pSubTitle <- 'This Works!'

    rmarkdown::render( 
      input       = inputFile, 
      encoding    = encoding, 
      params      = list(sub_title = pSubTitle),      
      output_file = pSubTitle) })
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown

This is an R Markdown document. ....
1
Floris Padt