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?
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()
.
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.
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
---
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.
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())
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.