Yeniden sıralamada YAML geçerli tarihi


247

Şu anki tarihi, .rmdişlenecek bir belgenin knitrve rmarkdownpaketin YAML ön öğesine koymak için bir hile olup olmadığını merak ediyorum . Wiki sayfalarımın üstünde aşağıdaki satır vardı,

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

ve 03 Mayıs 2014'te html çıktısında baptiste'ye dönüşecekti . Şimdi, tarafından sağlanan gelişmiş pandoc sarıcı yararlanmak istiyorum rmarkdown, ancak YAML başlığında r kodu olması işe yaramaz gibi görünüyor:

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

Herhangi bir çözüm var mı?


7
Bunun artık işe yaramadığına şaşırdım, çünkü eskiden yaptığım da buydu. Son zamanlarda neler olduğunu göreceğim. BTW, yaml !expr, örneğin R yoluyla hesaplanan değerleri de destekler date: !expr Sys.time(), ancak şimdi bu da çalışmaz.
Yihui Xie

Yanıtlar:


366

Bu biraz zor, ancak yalnızca datesatır içi R ifadesini alıntılayarak YAML'de alanı geçerli kılmanız gerekir , ör.

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

Ardından ayrıştırma hatası giderilecek ve Pandoc'un değerini kullanabilmesi için işaretleme çıktısında tarih oluşturulacaktır Sys.time().


Sanırım bu satır içi R, örneğin includes: after_body: [ ... ]geçerli bir YAML yalnızca dosya adı dizeleri olacağı için bir liste için kullanılamaz anlamına gelir ... Yani hiçbir olasılık includes: "`r list.files(...)`"?
Louis Maddox

1
@Yihui html çıktısında bu benim için çalışıyor, ancak YAML başlığında .mdvarsa sonuç dosyasında değil keep_md: true. Bunun için bir çözüm var mı?
Matt SM

7
İçin başka Amerikalılar: date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb

Merhaba @ Yihui, pdf dosyasında tarih çıktı bozuk ay var. Bu sorunu nasıl çözebilirim hakkında bir fikrin var mı? Teşekkür ederim.
HW-Bilim Adamı

2
r format(Sys.time(), '%d\\\\. %B %Y')
Tarihte bir noktaya

72

@Yihui'yi takip ediyorum. İşin garibi, buldum:

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

daha iyi çalışır:

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

İkincisi için RStudio, 'HTML ve PDF çıktısı arasında geçiş yaparken ve böylece kodu kırarken dış tırnakları değiştirmeyi seçer .


1
Ters eğik çizgi orada mıydı?
cwhy

4
Ters eğik çizgiler orada olmamalıdır. Onlar olmadan kod çalışır.
rakensi

1
kabul. "" benim için işe yaramadı ama '' işe yaradı. teşekkür ederim!
Leah Wasser

18

Ya da sadece tek tırnak çift tırnak ve tersi, Bu iyi çalışıyor.

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

12

Çözümlerden biri brewpaketi kullanmak ve YAML ön öğenizi brewşablon olarak yazmaktır .

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

Artık brew_n_renderdokümanı kullanarak önişleme yapıp brewdaha sonra içinden geçecek bir işlev kullanabilirsiniz 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)
}

Bunun KnitHTMLRStudio'daki düğmeyle çalışmasını sağlamak için otomatik brewolarak önişlemci olarak kullanılacak özel bir çıktı biçimi yazabilirsiniz . brewÖnişlem için kullanmak knitr, önişleme aşamasında belgenizdeki kod parçalarına dokunulmamasını sağlar. İdeal olarak, rmarkdownpaketin API'sindeki meta verileri göstermesi ve kullanıcıların bunu özel bir işlevle çalıştırmasına izin vermesi gerekir.


5
teşekkürler Ramnath, işe yarayacaktı. İş akışında fazladan adımların ve geçici dosyaların bulunmaması iyi olurdu; deneyimlerime göre süreç ne kadar kıvrımlıysa, birkaç ay sonra o kadar az tekrarlanabilir (yani nasıl çalıştığını hatırlayamıyorum).
vaftiz


1

resim açıklamasını buraya girinBenim için aynı problem için. Bu kodu kullanarak çözerim.

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

Güncelleme Başka bir format da kullanabilirsiniz.

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

En iyi.


-1

Bugün bundan ısırıldım. sahiptim

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

ve OP ile hemen hemen aynı hatayı aldılar, ancak sadece kelimeye örme yaparken. Word'e örme denemeden önce pdf'ye örme iyiydi. Sonrasında da işe yaramadı.

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`

31. pozisyon ilk% işaretidir

Bunu ile değiştirme

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

MLaVoie tarafından tavsiye edildiği gibi, iyi çalıştı.

Bunun neden olduğu hakkında hiçbir fikrim yok ve kazmaya gidecek zamanım yok - bitirmek için raporlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.