YAML data corrente in ribasso


247

Mi chiedo se ci sia un trucco per mettere la data corrente nella prima pagina di un .rmddocumento da elaborare knitre il rmarkdownpacchetto. Avevo la seguente riga nella parte superiore delle mie pagine wiki,

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

e verrebbe convertito in battista, il 3 maggio 2014 nell'output html. Ora, vorrei sfruttare il wrapper pandoc avanzato fornito da rmarkdown, ma avere il codice r nell'intestazione YAML non sembra funzionare:

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

Qualche soluzione?


7
Sono sorpreso che non funzioni più, poiché è esattamente quello che facevo prima. Vedrò cosa stava succedendo di recente. A proposito, yaml supporta anche i valori calcolati da R via !expr, ad esempio date: !expr Sys.time(), ma ora neanche questo funziona.
Yihui Xie

Risposte:


366

Questo è un po 'complicato, ma devi solo rendere il datecampo valido in YAML citando l'espressione R in linea, ad es.

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

Quindi l'errore di analisi scomparirà e la data verrà generata nell'output di markdown in modo che Pandoc possa utilizzare il valore da Sys.time().


Immagino che questo significhi che la linea inline R non può essere utilizzata, ad esempio, per un elenco in includes: after_body: [ ... ]quanto YAML valido sarebbe solo una stringa di nome file ... Quindi nessuna possibilità di includes: "`r list.files(...)`"?
Louis Maddox,

1
@Yihui questo funziona per me nell'output html, ma non nel .mdfile risultante se ho keep_md: truenell'intestazione YAML. Qualche soluzione per questo?
Matt SM,

7
Per tutti gli altri americani: date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb,

Ciao @Yihui, ho confuso il mese nell'output della data nel file pdf. Hai idea di come posso risolvere questo problema? Grazie.
Scienziato HW,

2
Se hai bisogno di un punto nella data, tieni a mente di scappare e di sfuggire alle fughe:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo

72

Sto solo seguendo @Yihui. Stranamente, ho scoperto che:

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

funziona meglio di:

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

Per quest'ultimo RStudio sceglie di modificare le virgolette esterne 'ogni volta che si passa tra l'output HTML e PDF e quindi si rompe il codice.


1
La barra rovesciata doveva essere lì?
cwhy,

4
Le barre rovesciate non dovrebbero essere lì. Senza di loro, il codice funziona.
rakensi,

1
concordato. "" non ha funzionato per me ma '' ha funzionato. grazie!
Leah Wasser,

18

O solo virgoletta singola tra virgolette doppie e viceversa, Funziona bene.

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

12

Una soluzione alternativa consiste nell'utilizzare il brewpacchetto e scrivere il modello YAML come brewmodello.

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

È ora possibile utilizzare una brew_n_renderfunzione che preelabora il documento utilizzando brewe quindi esegue 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)
}

Per farlo funzionare con il KnitHTMLpulsante in RStudio, è possibile scrivere un formato di output personalizzato che verrà utilizzato automaticamente brewcome preprocessore. L'uso brewdi preprocess assicura che i knitrblocchi di codice nel documento non vengano toccati durante la fase di preelaborazione. Idealmente, il rmarkdownpacchetto dovrebbe esporre i metadati nella sua API e consentire agli utenti di eseguirlo attraverso una funzione personalizzata.


5
grazie Ramnath, avrebbe funzionato. Sarebbe bello non avere i passaggi extra e i file temporanei nel flusso di lavoro; nella mia esperienza, più il processo è complicato, meno è riproducibile (cioè non ricordo come funziona) qualche mese dopo.
Baptista,


1

inserisci qui la descrizione dell'immaginePer lo stesso problema per me. Lo risolvo usando questo codice.

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

Aggiornamento Puoi usare anche un altro formato.

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

Migliore.


-1

Sono stato morso da questo oggi. avevo

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

e ha più o meno lo stesso errore dell'OP, ma solo quando si lavora a maglia a parole. Lavorare a maglia in pdf andava bene prima che provassi a lavorare a maglia su Word. Successivamente non ha funzionato neanche.

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 posizione 31 è il primo segno%

Sostituendo questo con

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

come consigliato da MLaVoie, ha funzionato bene.

Non ho idea del perché ciò sia accaduto e non ho tempo di scavare: i rapporti finiscono.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.