.rmd
ドキュメントのYAMLフロントマテリアルに現在の日付を入れて、knitr
およびrmarkdown
パッケージによって処理されるトリックがあるかどうか疑問に思っています。 wikiページの上部に次の行がありましたが、
_baptiste, `r format(Sys.time(), "%d %B, %Y")`_
hTML出力ではbaptiste、03 May、2014に変換されます。ここで、rmarkdown
によって提供される高度なpandocラッパーを利用したいと思いますが、YAMLヘッダーにrコードがあると機能しないようです:
---
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
回避策はありますか?
これは少し注意が必要ですが、YAMLでdate
フィールドを有効にするには、インラインR式を引用する必要があります。
date: "`r format(Sys.time(), '%d %B, %Y')`"
その後、解析エラーがなくなり、日付がマークダウン出力に生成されるため、PandocはSys.time()
の値を使用できます。
@Yihuiをフォローアップしています。奇妙なことに、私はそれを見つけました:
'`r format(Sys.Date(), "%B %d, %Y")`'
以下よりもうまく動作します:
"`r format(Sys.Date(), '%B %d, %Y')`"
後者の場合、RStudioは、HTML出力とPDF出力を切り替えるたびに外側の引用符を'
に変更し、コードを壊すことを選択します。
または、二重引用符を単一引用符で囲むか、その逆も同様です。これはうまく機能します。
---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: '`r format(Sys.time(), "%d %B, %Y")`'
author: baptiste
---
回避策の1つは、brew
パッケージを使用して、YAMLフロントマターをbrew
テンプレートとして記述することです。
---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: <%= format(Sys.time(), "%d %B, %Y") %>
author: baptiste
---
これで、brew
を使用してドキュメントを前処理してからrmarkdown
を実行するbrew_n_render
関数を使用できます。
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)
}
RStudioのKnitHTML
ボタンでこれを機能させるには、プリプロセッサとしてbrew
を自動的に使用するカスタム出力形式を作成できます。 brew
を使用して前処理を行うと、ドキュメント内のknitr
コードチャンクが前処理段階で変更されないことが保証されます。理想的には、rmarkdown
パッケージは、そのAPIでメタデータを公開し、ユーザーがカスタム関数を使用して実行できるようにする必要があります。
または、おそらく次のようなものを参照してください R Markdown Parameterized Reports
params:
reportDate:
input: date
label: 'Report Date:'
value: as.POSIXct(Sys.Date())