Date actuelle YAML dans rmarkdown

247

Je me demande s'il y a une astuce pour mettre la date actuelle dans la première page YAML d'un .rmddocument à traiter knitret du rmarkdownpackage. J'avais l'habitude d'avoir la ligne suivante en haut de mes pages wiki,

   _baptiste, `r format(Sys.time(), "%d %B, %Y")`_

et il serait converti en baptiste, le 03 mai 2014 dans la sortie html. Maintenant, je voudrais profiter du wrapper pandoc avancé fourni par rmarkdown, mais avoir le code r dans l'en-tête YAML ne semble pas fonctionner:

---
title: "Sample Document"
output:
  html_document:
    toc: true
    theme: united
date: `r format(Sys.time(), "%d %B, %Y")`
author: baptiste
---

Error in yaml::yaml.load(front_matter) : 
  Scanner error: while scanning for the next token at line 6, column 7
 found character that cannot start any token at line 6, column 7
Calls: <Anonymous> ... output_format_from_yaml_front_matter -> 
       parse_yaml_front_matter -> <Anonymous> -> .Call

Une solution?

baptiste
la source
7
Je suis surpris que cela ne fonctionne plus, car c'est exactement ce que je faisais auparavant. Je verrai ce qui se passait récemment. BTW, yaml prend également en charge les valeurs calculées à partir de R via !expr, par exemple date: !expr Sys.time(), mais maintenant cela ne fonctionne pas non plus.
Yihui Xie

Réponses:

366

C'est un peu délicat, mais il vous suffit de rendre le datechamp valide en YAML en citant l'expression R en ligne, par exemple

date: "`r format(Sys.time(), '%d %B, %Y')`"

Ensuite, l'erreur d'analyse aura disparu et la date sera générée dans la sortie de démarque afin que Pandoc puisse utiliser la valeur de Sys.time().

Yihui Xie
la source
Je suppose que cela signifie que R en ligne ne peut pas être utilisé par exemple pour une liste includes: after_body: [ ... ]car YAML valide ne serait que des chaînes de nom de fichier ... Donc, aucune possibilité de includes: "`r list.files(...)`"?
Louis Maddox
1
@Yihui cela fonctionne pour moi dans la sortie html, mais pas dans le .mdfichier résultant si je l'ai keep_md: truedans l'en-tête YAML. Une solution pour ça?
Matt SM
7
Pour tout autre: les Américains date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb
Salut @Yihui, j'ai obtenu un mois brouillé en sortie de date dans le fichier pdf. Avez-vous une idée de comment résoudre ce problème? Je vous remercie.
HW-Scientist
2
Si vous avez besoin d'un point dans la date, n'oubliez pas de leur échapper et d'échapper aux évasions:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo
72

Je fais juste un suivi sur @Yihui. Curieusement, j'ai constaté que:

'`r format(Sys.Date(), "%B %d, %Y")`'

fonctionne mieux que:

"`r format(Sys.Date(), '%B %d, %Y')`"

Pour ce dernier, RStudio choisit de changer les guillemets externes en 'basculant entre la sortie HTML et PDF et donc de casser le code.

John M
la source
1
La barre oblique inverse était-elle censée être là?
cwhy
4
Les barres obliques inverses ne devraient pas être présentes. Sans eux, le code fonctionne.
rakensi
1
D'accord. "" n'a pas fonctionné pour moi mais '' l'a fait. Merci!
Leah Wasser
18

Ou juste des guillemets simples et vice versa, cela fonctionne bien.

---
title: "Sample Document"
output:
  html_document:
    toc: true
    theme: united
date: '`r format(Sys.time(), "%d %B, %Y")`'
author: baptiste
---
SabDeM
la source
12

Une solution de contournement consiste à utiliser le brewpackage et à écrire votre sujet YAML en tant que brewmodèle.

---
title: "Sample Document"
output:
  html_document:
    toc: true
    theme: united
date: <%= format(Sys.time(), "%d %B, %Y") %>
author: baptiste
---

Vous pouvez maintenant utiliser une brew_n_renderfonction qui pré-traiterait le document à l'aide brewpuis l'exécuterait rmarkdown.

brew_n_render <- function(input, ...){
  output_file <- gsub("\\.[R|r]md$", ".html", input)
  brew::brew(input, 'temp.Rmd');  on.exit(unlink('temp.Rmd'))
  rmarkdown::render('temp.Rmd', output_file = output_file)
}

Pour que cela fonctionne avec le KnitHTMLbouton dans RStudio, vous pouvez écrire un format de sortie personnalisé qui sera automatiquement utilisé brewcomme préprocesseur. L'utilisation brewdu prétraitement garantit que les knitrmorceaux de code de votre document ne sont pas modifiés pendant l'étape de prétraitement. Idéalement, le rmarkdownpackage devrait exposer les métadonnées dans son API et permettre aux utilisateurs de l'exécuter via une fonction personnalisée.

Ramnath
la source
5
merci Ramnath, cela fonctionnerait. Ce serait bien de ne pas avoir les étapes supplémentaires et les fichiers temporaires dans le workflow; d'après mon expérience, plus le processus est compliqué, moins il est reproductible (c'est-à-dire que je ne me souviens plus comment il fonctionne) quelques mois plus tard.
baptiste
1

entrez la description de l'image iciPour le même problème pour moi. Je le résous en utilisant ce code.

---
title: "bla bla"
author: "My name"
date: \`r format(Sys.Date(), "%B %d, %Y")`\
output: html_document
---

Mise à jour Vous pouvez également utiliser un autre format.

---
title: "bla bla"
author: "My name"
date: \`r format(Sys.Date(), "%m %d,%Y")`\
output: html_document
---

Meilleur.

Saber bouabid
la source
-1

J'ai été mordu par cela aujourd'hui. j'ai eu

date: "`r format(Sys.Date(), "%B %d, %Y")`"

et a obtenu plus ou moins la même erreur que l'OP, mais seulement en tricotant au mot. Tricoter en pdf était bien avant d'essayer de tricoter en Word. Après ça n'a pas marché non plus.

Error in yaml::yaml.load(front_matter) : 
  Scanner error: while scanning for the next token at line 3, column 31
 found character that cannot start any token at line 3, column 31
Calls: <Anonymous> ... output_format_from_yaml_front_matter -> 
       parse_yaml_front_matter -> <Anonymous> -> .Call`

La position 31 est le premier signe%

Remplacer cela par

date: '`r format(Sys.Date(), "%B %d, %Y")`'

comme conseillé par MLaVoie, a bien fonctionné.

Je n'ai aucune idée pourquoi cela s'est produit, et je n'ai pas le temps d'aller creuser - les rapports pour terminer.

astaines
la source