Fecha actual de YAML en rmarkdown

247

Me pregunto si hay un truco para poner la fecha actual en la parte delantera de YAML de un .rmddocumento para ser procesado por knitrel rmarkdownpaquete. Solía ​​tener la siguiente línea en la parte superior de mis páginas wiki,

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

y se convertiría a baptiste, 03 de mayo de 2014 en la salida html. Ahora, me gustaría aprovechar el envoltorio avanzado de pandoc provisto por rmarkdown, pero tener código r en el encabezado YAML no parece funcionar:

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

¿Alguna solución?

bautista
fuente
77
Me sorprende que esto ya no funcione, ya que esto es exactamente lo que solía hacer. Veré lo que estaba sucediendo recientemente. Por cierto, yaml también admite valores calculados a partir de R vía !expr, por ejemplo date: !expr Sys.time(), pero ahora esto tampoco funciona.
Yihui Xie

Respuestas:

366

Esto es un poco complicado, pero solo necesita hacer que el datecampo sea válido en YAML citando la expresión R en línea, por ejemplo

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

Luego, el error de análisis desaparecerá y la fecha se generará en la salida de reducción para que Pandoc pueda usar el valor Sys.time().

Yihui Xie
fuente
Supongo que esto significa que R en línea no se puede usar, por ejemplo, para una lista includes: after_body: [ ... ]como YAML válida solo serían cadenas de nombre de archivo ... ¿Entonces no hay posibilidad de includes: "`r list.files(...)`"?
Louis Maddox
1
@Yihui esto funciona para mí en la salida html, pero no en el .mdarchivo resultante si tengo keep_md: trueen el encabezado YAML. ¿Alguna solución para esto?
Matt SM
77
Para cualquier otro estadounidense: date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb
Hola @Yihui, obtuve un mes confuso en la salida de la fecha en el archivo pdf. ¿Tienes alguna idea de cómo puedo resolver este problema? Gracias.
HW-Scientist
2
Si necesita un punto en la fecha, tenga en cuenta para escapar de ellos y escapar de los escapes:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo
72

Solo siguiendo a @Yihui. Curiosamente, he encontrado que:

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

funciona mejor que:

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

Para este último, RStudio elige cambiar las comillas externas 'cada vez que cambia entre salida HTML y PDF y, por lo tanto, rompe el código.

John M
fuente
1
¿La barra invertida estaba destinada a estar allí?
cwhy
44
Las barras invertidas no deberían estar allí. Sin ellos, el código funciona.
rakensi
1
convenido. "" no funcionó para mí pero sí ". ¡gracias!
Leah Wasser
18

O simplemente comillas simples comillas dobles y viceversa, esto funciona bien.

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

Una solución alternativa es usar el brewpaquete y escribir su contenido de YAML como brewplantilla.

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

Ahora puede usar un brew_n_render función que preprocesará el documento usando brewy luego se ejecutará 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)
}

Para que esto funcione con el KnitHTMLbotón en RStudio, puede escribir un formato de salida personalizado que se usará automáticamente brewcomo preprocesador. El uso brewde preprocesamiento garantiza que los knitrfragmentos de código de su documento no se toquen durante la etapa de preprocesamiento. Idealmente, elrmarkdown paquete debería exponer los metadatos en su API y permitir a los usuarios ejecutarlo a través de una función personalizada.

Ramnath
fuente
55
gracias Ramnath, eso funcionaría. Sería bueno no tener los pasos adicionales y los archivos temporales en el flujo de trabajo; En mi experiencia, cuanto más complicado es el proceso, menos reproducible (es decir, no recuerdo cómo funciona) unos meses más tarde.
Baptiste
1

ingrese la descripción de la imagen aquíPor el mismo problema para mí. Lo resuelvo usando este código.

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

Actualización También puede usar otro formato.

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

Mejor.

Saab Bouabid
fuente
-1

Hoy fui mordido por esto. yo tenía

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

y obtuve más o menos el mismo error que el OP, pero solo al tejer a la palabra. Tejer en pdf estaba bien antes de intentar tejer en Word. Después tampoco funcionó.

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 posición 31 es el primer signo de%

Reemplazando esto con

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

según lo aconsejado por MLaVoie, funcionó bien.

No tengo idea de por qué sucedió esto, y no tengo tiempo para cavar, informes para terminar.

astaines
fuente