YAML aktuelles Datum in rmarkdown

247

Ich frage mich, ob es einen Trick gibt, das aktuelle Datum in die YAML-Titelseite eines .rmdzu verarbeitenden Dokuments knitrund des rmarkdownPakets aufzunehmen. Früher hatte ich die folgende Zeile oben auf meinen Wiki-Seiten:

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

und es würde am 3. Mai 2014 in der HTML-Ausgabe zu baptiste konvertiert werden. Jetzt möchte ich den erweiterten Pandoc-Wrapper von nutzen rmarkdown, aber r-Code im YAML-Header zu haben scheint nicht zu funktionieren:

---
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

Irgendeine Problemumgehung?

Baptiste
quelle
7
Ich bin überrascht, dass dies nicht mehr funktioniert, da ich genau das getan habe. Ich werde sehen, was in letzter Zeit los war. Übrigens unterstützt yaml auch Werte, die beispielsweise aus R via berechnet !exprwurden date: !expr Sys.time(), aber jetzt funktioniert dies auch nicht.
Yihui Xie

Antworten:

366

Dies ist etwas schwierig, aber Sie müssen das dateFeld nur in YAML gültig machen, indem Sie den Inline-R-Ausdruck zitieren, z

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

Dann ist der Parsing-Fehler verschwunden und das Datum wird in der Markdown-Ausgabe generiert, damit Pandoc den Wert von verwenden kann Sys.time().

Yihui Xie
quelle
Ich denke, dies bedeutet, dass Inline R nicht für eine Liste verwendet werden kann, includes: after_body: [ ... ]da gültige YAML nur Dateinamenzeichenfolgen sind ... Also keine Möglichkeit von includes: "`r list.files(...)`"?
Louis Maddox
1
@ Yihui das funktioniert bei mir in der HTML-Ausgabe, aber nicht in der resultierenden .mdDatei, wenn ich keep_md: trueim YAML-Header habe. Irgendeine Lösung dafür?
Matt SM
7
Für alle anderen Amerikaner : date: "`r format(Sys.time(), '%B %d, %Y')`".
Ubomb
Hallo @ Yihui, ich habe einen Monat in der Datumsausgabe in der PDF-Datei verstümmelt. Haben Sie eine Idee, wie ich dieses Problem lösen kann? Danke dir.
HW-Wissenschaftler
2
Wenn Sie einen Punkt im Datum benötigen, denken Sie daran, ihnen zu entkommen und den Fluchten zu entkommen:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo
72

Ich folge nur @Yihui. Seltsamerweise habe ich das gefunden:

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

funktioniert besser als:

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

Für letztere entscheidet sich RStudio dafür, die äußeren Anführungszeichen zu ändern, 'wenn zwischen HTML- und PDF-Ausgabe gewechselt wird und somit der Code gebrochen wird.

John M.
quelle
1
Sollte der Backslash da sein?
Warum
4
Die Backslashes sollten nicht vorhanden sein. Ohne sie funktioniert der Code.
Rakensi
1
einverstanden. "" hat bei mir nicht funktioniert, aber '' hat funktioniert. Danke!
Leah Wasser
18

Oder einfach nur einfache Anführungszeichen und umgekehrt. Das funktioniert gut.

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

Eine Problemumgehung besteht darin, das brewPaket zu verwenden und Ihre YAML-Titelseite als brewVorlage zu schreiben .

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

Sie können jetzt eine brew_n_renderFunktion verwenden, die das Dokument mit vorverarbeitet brewund dann durchläuft 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)
}

Damit dies mit der KnitHTMLSchaltfläche in RStudio funktioniert , können Sie ein benutzerdefiniertes Ausgabeformat schreiben, das automatisch brewals Präprozessor verwendet wird. Durch die Verwendung brewder Vorverarbeitung wird sichergestellt, dass die knitrCodeblöcke in Ihrem Dokument während der Vorverarbeitungsphase unberührt bleiben. Im Idealfall sollte das rmarkdownPaket die Metadaten in seiner API verfügbar machen und es Benutzern ermöglichen, sie über eine benutzerdefinierte Funktion auszuführen.

Ramnath
quelle
5
danke Ramnath, das würde funktionieren. Es wäre schön, die zusätzlichen Schritte und temporären Dateien nicht im Workflow zu haben. Nach meiner Erfahrung ist der Prozess einige Monate später umso weniger reproduzierbar (dh ich kann mich nicht erinnern, wie er funktioniert), je komplizierter der Prozess ist.
Baptiste
3

oder, vielleicht so etwas wie das Folgende, siehe R Markdown Parametrized Reports

params:
  reportDate:
    input: date
    label: 'Report Date:'
    value: as.POSIXct(Sys.Date())
Nur ein anderer
quelle
1

Geben Sie hier die Bildbeschreibung einFür das gleiche Problem für mich. Ich löse es mit diesem Code.

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

Update Sie können auch ein anderes Format verwenden.

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

Beste.

Saber Bouabid
quelle
-1

Das hat mich heute gebissen. ich hatte

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

und bekam mehr oder weniger den gleichen Fehler wie das OP, aber nur beim Stricken zu Wort. Das Stricken mit PDF war in Ordnung, bevor ich versuchte, mit Word zu stricken. Danach hat es auch nicht funktioniert.

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`

Position 31 ist das erste% -Zeichen

Ersetzen durch

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

wie von MLaVoie empfohlen, hat gut funktioniert.

Ich habe keine Ahnung, warum das passiert ist, und ich habe keine Zeit zum Graben - Berichte zum Abschluss.

Astaines
quelle