web-dev-qa-db-ja.com

r MarkdownのYamlヘッダーの単一引用符と二重引用符の違いは何ですか?

RStudioでknitrを使用してコンパイルしているr Markdownファイルでエラーが発生します。私はこの「エラー」がどこに向けられるべきか本当にわかりません。一言で言うと「R」エラーではないようです。

次のYAMLヘッダーコンテンツを含むRマークダウンドキュメントを作成すると、ファイルをうまく編成できます。

---
title: "Eye tracking AOI plots"
author: "Steven Vannoy"
date:  "`r format(Sys.time(), '%I:%M')`"
output: html_document
---

しかし、単にformatステートメント内の単一引用符を二重引用符に変更した場合(これは、私が最初に使用していたものです)、

---
title: "Eye tracking AOI plots"
author: "Steven Vannoy"
date:  "`r format(Sys.time(), "%I:%M")`"
output: html_document
---

次の実行時エラーが発生します。

Error in yaml::yaml.load(enc2utf8(string), ...) : 
  Scanner error: while scanning for the next token at line 3, column 32found character that cannot start any token at line 3, column 32
Calls: <Anonymous> ... yaml_load_utf8 -> mark_utf8 -> <Anonymous> -> .Call
Execution halted

コロン ':'が問題の原因であることを確認するために十分に実験しました。たとえば、「%A%d」を使用してもエラーは発生しません。

周りを検索したところ、Rで一重引用符と二重引用符が一般に同等であるという多くのアサーションが見つかりましたが、二重引用符と単一引用符を組み合わせて2つの二重引用符のように機能させることはできません。

明らかに、私がする必要があることを行う実際のコードサンプルがありますが、通常は二重引用符を使用していて、単一引用符をいつ使用すべきかをどのようにして知ることができるのか疑問に思っていますか?

18
svannoy

Rで一重引用符と二重引用符が一般に同等である(Pythonの場合と同様)のは関係なく、解析の問題はYAMLレベルで発生します。

YAMLでスカラーを引用する必要はありませんが、引用する場合は 二重引用符で囲まれたスタイルのスカラー")エスケープが必要:

これは、「\」エスケープシーケンスを使用して任意の文字列を表現できる唯一のスタイルです。これは、「\」と「 "」の文字をエスケープする必要があるという代償を伴います。

したがって、二重引用符内で二重引用符を使用する場合は、次のようにする必要があります。

---
title: "Eye tracking AOI plots"
author: "Steven Vannoy"
date:  "`r format(Sys.time(), \"%I:%M\")`"
output: html_document
---

SabDeMのソリューションも機能するのは、スカラー内に単一引用符がないためです。

`r format(Sys.time(), "%I:%M")`

ただし、一重引用符スタイルのスカラーは、印刷可能な文字のみで構成される文字列のみを表すことができます。


すでにキー(titleauthorなど)で行っているように、YAMLでスカラーを引用する必要がないことがよくあります。ただし、プレーンスタイルのスカラーは、逆引用符で始めることはできません。 dateキーの値を除くすべてのスカラーに プレーンスタイル を使用し、その1つ(のみ)に リテラルスタイル を使用して、 IMOの読みやすさ:

---
title: Eye tracking AOI plots
author: Steven Vannoy
date: |-
  `r format(Sys.time(), "%I:%M")`
output: html_document
---

これはYAMLとまったく同じです。

13
Anthon

コメントで述べたように、問題はネストされたシンボルを解析する方法がknitrにわからないこと、または `を引用するために"が必要であるという事実に関連している可能性があります。このコードは機能し、後者の仮説にプラスを与えます:

---
title: "Eye tracking AOI plots"
author: "Steven Vannoy"
date:  '`r format(Sys.time(), "%I:%M")`'
output: html_document
---
1
SabDeM