web-dev-qa-db-fra.com

YAML date actuelle dans rmarkdown

Je me demande s’il est possible de placer la date du jour dans le texte YAML d’un document .rmd à traiter par knitr et le package rmarkdown. J'avais l'habitude d'avoir la ligne suivante en haut de mes pages de wiki,

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

et il serait converti en baptiste, 03 mai 2014 dans la sortie html. Maintenant, j'aimerais profiter de l'encapsuleur pandoc avancé fourni par rmarkdown, mais avoir du 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 de contournement?

207
baptiste

C’est un peu délicat, mais vous devez simplement rendre le champ date valide dans YAML en citant l’expression inline R, par exemple.

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

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

311
Yihui Xie

Juste pour continuer sur @Yihui. Bizarrement, j'ai trouvé que:

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

fonctionne mieux que:

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

Pour ce dernier, RStudio choisit de remplacer les guillemets extérieurs par ' à chaque commutation entre HTML et PDF en sortie et ainsi rompre le code.

65
John M

Ou bien, citez simplement les guillemets simples et inversement, cela fonctionne bien.

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

Une solution consiste à utiliser le package brew et à écrire votre texte YAML en tant que modèle brew.

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

Vous pouvez maintenant utiliser une fonction brew_n_render qui pré-traiterait le document à l'aide de brew, puis s'exécutera via 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 bouton KnitHTML dans RStudio, vous pouvez écrire un format de sortie personnalisé qui utilisera automatiquement brew comme préprocesseur. L'utilisation de brew pour le prétraitement garantit que les fragments de code knitr de votre document sont intacts pendant la phase de prétraitement. Idéalement, le package rmarkdown devrait exposer les métadonnées de son API et permettre aux utilisateurs de les exécuter via une fonction personnalisée.

11
Ramnath

ou, peut-être quelque chose comme ce qui suit, voir R Markdown Parameterized Reports

params:
  reportDate:
    input: date
    label: 'Report Date:'
    value: as.POSIXct(Sys.Date())
3
JustAnother

enter image description here Pour 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.

0
Saber bouabid