Tanggal saat ini dalam rmarkdown


247

Saya ingin tahu apakah ada trik untuk memasukkan tanggal saat ini di bagian depan .rmddokumen YAML untuk diproses oleh knitrdan rmarkdownpaket. Saya dulu memiliki baris berikut di bagian atas halaman wiki saya,

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

dan itu akan dikonversi ke baptiste, 03 Mei, 2014 di output html. Sekarang, saya ingin mengambil keuntungan dari pembungkus pandoc canggih yang disediakan oleh rmarkdown, tetapi memiliki kode r di header YAML tampaknya tidak berfungsi:

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

Ada solusi?


7
Saya terkejut bahwa ini tidak lagi berfungsi, karena inilah yang biasa saya lakukan. Saya akan melihat apa yang sedang terjadi baru-baru ini. BTW, yaml juga mendukung nilai yang dihitung dari R via !expr, mis. date: !expr Sys.time(), Tetapi sekarang ini tidak berfungsi.
Yihui Xie

Jawaban:


366

Ini sedikit rumit, tetapi Anda hanya perlu membuat datebidang tersebut valid dalam YAML dengan mengutip ekspresi inline R, mis.

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

Kemudian kesalahan parsing akan hilang, dan tanggal akan dihasilkan dalam output penurunan harga sehingga Pandoc dapat menggunakan nilai dari Sys.time().


Saya kira ini berarti inline R tidak dapat digunakan untuk misalnya daftar includes: after_body: [ ... ]sebagai YAML yang valid hanya akan menjadi string nama file ... Jadi tidak ada kemungkinan includes: "`r list.files(...)`"?
Louis Maddox

1
@ Yihui ini bekerja untuk saya di output html, tetapi tidak dalam .mdfile yang dihasilkan jika saya miliki keep_md: truedi header YAML. Ada solusi untuk ini?
Matt SM

7
Untuk setiap orang Amerika lainnya: date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb

Hai @ Yihui, saya mendapatkan output tanggal yang kacau di file pdf. Apakah Anda tahu bagaimana cara mengatasi masalah ini? Terima kasih.
HW-Scientist

2
Jika Anda membutuhkan titik di tanggal, ingatlah untuk melarikan diri dan melarikan diri:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo

72

Hanya menindaklanjuti @Yihui. Anehnya, saya telah menemukan bahwa:

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

bekerja lebih baik daripada:

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

Untuk yang terakhir RStudio memilih untuk mengubah kutipan luar untuk 'setiap kali beralih antara HTML dan output PDF dan dengan demikian melanggar kode.


1
Apakah backslash seharusnya ada di sana?
cwhy

4
Garis miring terbalik seharusnya tidak ada di sana. Tanpa mereka, kodenya bekerja.
rakensi

1
sepakat. "" tidak bekerja untuk saya tetapi 'berhasil. Terima kasih!
Leah Wasser

18

Atau hanya satu kutipan kutip ganda dan sebaliknya, ini bekerja dengan baik.

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

12

Salah satu solusinya adalah dengan menggunakan brewpaket dan menulis materi depan YAML Anda sebagai brewtemplat.

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

Anda sekarang dapat menggunakan brew_n_renderfungsi yang akan memproses ulang menggunakan doc brewdan kemudian dijalankan melalui 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)
}

Untuk membuatnya bekerja dengan KnitHTMLtombol di RStudio, Anda dapat menulis format output khusus yang akan secara otomatis digunakan brewsebagai preprosesor. Menggunakan brewuntuk preprocess memastikan bahwa knitrpotongan kode dalam dokumen Anda tidak tersentuh selama tahap preprocessing. Idealnya, rmarkdownpaket harus mengekspos metadata di API-nya dan memungkinkan pengguna untuk menjalankannya melalui fungsi kustom.


5
terima kasih Ramnath, itu akan berhasil. Alangkah baiknya untuk tidak memiliki langkah-langkah ekstra dan temp file dalam alur kerja; dalam pengalaman saya, semakin berbelit-belit prosesnya, semakin sedikit hal itu dapat direproduksi (yaitu saya tidak dapat mengingat cara kerjanya) beberapa bulan kemudian.
baptiste


1

masukkan deskripsi gambar di siniUntuk masalah yang sama bagi saya. Saya menyelesaikannya dengan menggunakan kode ini.

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

Perbarui Anda juga dapat menggunakan format lain.

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

Terbaik.


-1

Saya digigit oleh ini hari ini. Saya punya

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

dan mendapatkan lebih atau kurang kesalahan yang sama dengan OP, tetapi hanya ketika merajut ke kata. Merajut ke pdf baik-baik saja sebelum saya mencoba merajut ke Word. Setelah itu tidak berhasil juga.

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`

Posisi 31 adalah tanda% pertama

Mengganti ini dengan

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

seperti yang disarankan oleh MLaVoie, bekerja dengan baik.

Saya tidak tahu mengapa ini terjadi, dan saya tidak punya waktu untuk menggali - laporan selesai.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.