Ngày hiện tại YAML trong rmarkdown


247

Tôi tự hỏi liệu có một mẹo để đưa ngày hiện tại vào phần trước của YAML của một .rmdtài liệu được xử lý theo knitrrmarkdowngói. Tôi đã từng có dòng sau ở đầu trang wiki của tôi,

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

và nó sẽ được chuyển đổi thành baptiste, 03 tháng 5 năm 2014 trong đầu ra html. Bây giờ, tôi muốn tận dụng trình bao bọc pandoc tiên tiến được cung cấp bởi rmarkdown, nhưng có mã r trong tiêu đề YAML dường như không hoạt động:

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

Bất kỳ cách giải quyết?


7
Tôi ngạc nhiên rằng điều này không còn hoạt động nữa, vì đây chính xác là những gì tôi từng làm. Tôi sẽ thấy những gì đang xảy ra gần đây. BTW, yaml cũng hỗ trợ các giá trị được tính toán từ R thông qua !expr, ví dụ date: !expr Sys.time(), nhưng bây giờ điều này cũng không hoạt động.
Yihui Xie

Câu trả lời:


366

Đây là một chút khó khăn, nhưng bạn chỉ cần làm cho datetrường hợp lệ trong YAML bằng cách trích dẫn biểu thức R nội tuyến, ví dụ:

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

Sau đó, lỗi phân tích cú pháp sẽ biến mất và ngày sẽ được tạo trong đầu ra đánh dấu để Pandoc có thể sử dụng giá trị từ đó Sys.time().


Tôi đoán điều này có nghĩa là R nội tuyến không thể được sử dụng cho ví dụ như một danh sách includes: after_body: [ ... ]vì YAML hợp lệ sẽ chỉ là các chuỗi tên tệp ... Vì vậy, không có khả năng includes: "`r list.files(...)`"nào?
Louis Maddox

1
@Yihui cái này hoạt động với tôi trong đầu ra html, nhưng không phải trong .mdtệp kết quả nếu tôi có keep_md: truetrong tiêu đề YAML. Bất kỳ giải pháp cho điều này?
Matt SM

7
Đối với bất kỳ người Mỹ khác : date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb

Xin chào @Yihui, tôi đã bị cắt xén tháng đầu ra trong tệp pdf. Bạn có biết làm thế nào tôi có thể giải quyết vấn đề này? Cảm ơn bạn.
Nhà khoa học-

2
Nếu bạn cần một dấu chấm trong ngày, hãy ghi nhớ để thoát khỏi chúng và thoát khỏi những người trốn thoát:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo

72

Chỉ cần theo dõi trên @Yihui. Kì lạ thay, tôi đã thấy rằng:

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

hoạt động tốt hơn:

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

Đối với RStudio sau, chọn thay đổi dấu ngoặc kép bên ngoài thành 'bất cứ khi nào chuyển đổi giữa đầu ra HTML và PDF và do đó phá vỡ mã.


1
Là dấu gạch chéo có nghĩa là ở đó?
cwhy

4
Các dấu gạch chéo ngược không nên ở đó. Không có chúng, mã hoạt động.
rakensi

1
đã đồng ý. "" không làm việc cho tôi nhưng '' đã làm. cảm ơn bạn!
Leah Wasser

18

Hoặc chỉ trích dẫn một dấu ngoặc kép và ngược lại, Điều này hoạt động tốt.

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

12

Một cách giải quyết khác là sử dụng brewgói và viết phần trước YAML của bạn làm brewmẫu.

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

Bây giờ bạn có thể sử dụng một brew_n_renderhàm sẽ xử lý trước tài liệu bằng cách sử dụng brewvà sau đó chạy qua 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)
}

Để thực hiện công việc này với KnitHTMLnút trong RStudio, bạn có thể viết định dạng đầu ra tùy chỉnh sẽ tự động sử dụng brewlàm bộ xử lý trước. Sử dụng brewđể tiền xử lý đảm bảo rằng các knitrđoạn mã trong tài liệu của bạn không bị ảnh hưởng trong giai đoạn tiền xử lý. Lý tưởng nhất là rmarkdowngói nên hiển thị siêu dữ liệu trong API của nó và cho phép người dùng chạy nó thông qua chức năng tùy chỉnh.


5
cảm ơn Ramnath, điều đó sẽ làm việc Sẽ thật tốt nếu không có các bước bổ sung và tệp tạm thời trong quy trình làm việc; theo kinh nghiệm của tôi, quá trình càng phức tạp, nó càng ít tái sản xuất (tức là tôi không thể nhớ nó hoạt động như thế nào) một vài tháng sau đó.
baptiste


1

nhập mô tả hình ảnh ở đâyĐối với cùng một vấn đề cho tôi. Tôi giải quyết nó bằng cách sử dụng mã này.

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

Cập nhật Bạn cũng có thể sử dụng định dạng khác.

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

Tốt.


-1

Tôi đã bị cắn bởi điều này ngày hôm nay. Tôi đã có

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

và nhận được ít nhiều lỗi giống như OP, nhưng chỉ khi đan thành từ. Đan sang pdf là tốt trước khi tôi thử đan vào Word. Sau đó nó cũng không hoạt động.

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`

Vị trí 31 là ký hiệu% đầu tiên

Thay thế điều này bằng

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

theo lời khuyên của MLaVoie, đã hoạt động tốt.

Tôi không biết tại sao điều này lại xảy ra và tôi không có thời gian để đi đào - báo cáo kết thúc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.