对于Markdown,Yaml标题中的单引号和双引号有什么区别?

sva*_*noy 16 yaml r knitr

我正在使用RStudio中的knitr编译我的Markdown文件中的错误.我不确定这个'错误'应该指向哪里.每个说法似乎不是'R'错误.

如果我创建一个带有以下YAML标题内容的R markdown文档,我可以编辑该文件:

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

但是,如果我只是将format语句中的单引号更改为双引号(这是我最初使用的),

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

我得到以下运行时错误:

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
Run Code Online (Sandbox Code Playgroud)

我进行了足够的实验,知道它是冒号':'导致问题,如果您使用"%A%d",则不会产生错误.

我在周围搜索并发现了一些断言,单引号和双引号在R中通常是等价的,尽管你不能将双引号与单引号配对并让它像两个双引号一样.

显然我有一个工作代码示例,它做了我需要做的事情,但我通常使用双引号,我想知道我怎么知道什么时候应该使用单引号?

Ant*_*hon 13

单引号和双引号在R中通常是等价的(就像它们在Python中一样)是无关紧要的,解析问题发生在YAML级别上.

你不需要在YAML中引用标量,但是如果你这样做,你需要知道双引号样式标量(")需要转义:

这是唯一能够通过使用"\"转义序列表达任意字符串的样式.这是以逃避"\"和""字符为代价的.

因此,如果您想在双引号内使用双引号,则必须执行以下操作:

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

SabDeM的解决方案也起作用,因为标量中没有单引号

`r format(Sys.time(), "%I:%M")`
Run Code Online (Sandbox Code Playgroud)

但是,单引号样式标量只能表示仅包含可打印字符的字符串.


标量往往并不需要在YAML在所有被引用,因为你已经用钥匙(做title,author等).但是简单的样式标量不能以反引号开头.我会为所有标量使用普通样式,除了date键的值和使用该文字样式(仅),以使IMO更易读:

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

这与您的YAML完全相同.


Sab*_*DeM 1

正如我在评论中所说,问题可能在于 knit 不知道如何解析嵌套符号,或者问题可能与引用 ` 您需要的事实有关,"反之亦然。这段代码有效,并为后一个假设提供了一个优势:

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