使用RStudio knit按钮下拉列表时,为什么YAML中的输出顺序会发生变化?

使用RStudio knit按钮下拉列表时,为什么YAML中的输出顺序会发生变化?,r,yaml,rstudio,r-markdown,R,Yaml,Rstudio,R Markdown,RStudio将根据上次在knit下拉按钮中选择的选项对YAML中的输出列表重新排序 --- title: "Untitled" output: html_document: default word_document: default --- 上面的YAML头提供了将RMarkdown编译为word或html的选项。它将在顶部为您提供主选项,在本例中为html\u文档 当下拉列表用于选择备用输出时,例如,word\u document,输出顺序将改变如下: --- title: "U

RStudio将根据上次在knit下拉按钮中选择的选项对YAML中的输出列表重新排序

---
title: "Untitled"
output:
  html_document: default
  word_document: default
---
上面的YAML头提供了将RMarkdown编译为word或html的选项。它将在顶部为您提供主选项,在本例中为
html\u文档

当下拉列表用于选择备用输出时,例如,
word\u document
,输出顺序将改变如下:

---
title: "Untitled"
output:
  word_document: default
  html_document: default
---
我假设(从Jonathan和Kevin对前一个问题的有益评论中),这是由于RStudio读取RMarkdown并提供上下文按钮的方式造成的,但是,我很好奇,这种重新排序是否可以以某种方式“关闭”


这样做的一个动机是版本控制。这将更改文本文档,该文档注册为修改,因此强制提交或还原。

行的顺序更改对于版本控制来说肯定是一个问题,但根据YAML规范,映射中的键是无序的,加载转储不能保证提供相同的值

有些库按键的排序值转储映射,但这不是必需的,对于所有键类型相同且可以排序的映射以外的任何东西都没有多大意义

因此,您可以从两个示例中加载的YAML是完全相同的,前提是解析器遵循标准。如果键值的顺序很重要,正确的方法是列出单个键值映射(破折号可以,但不必缩进):

并可选择放入标签
!!omap
要确保这是一个有序的映射:

title: "Untitled"
output: !!omap
- html_document: default
- word_document: default

当然,RStudio可能会在映射中使用行的顺序(我自己在ruamel.yaml Python包中这样做,以允许在不重新排序键的情况下进行往返)。但是更正确的方法是使用
!!omap
,或以其他方式指示选定的键或键的顺序。

这是一个非常烦人的问题

我主要使用nb.html,但有时我想编织一个PDF

我一编制PDF文件:

  • 我必须手动重新排序输出,否则nb.html可能无法再保存
  • 我必须恢复输出字段中的任何注释,因为它们都会自动删除
到目前为止,我最好的解决方案是将YAML头的干净副本保存在正下方的块中


这很难看,但我尝试过更复杂的解决方案,比如r表达式。它们失败了,因为RStudio检查YAML标题(cf)中的文字“html_notebook”字段,因此没有干净的解决方法

可以使用YAML标题而不进行更改,但是不能使用knitr按钮,必须使用
rmarkdown::render
命令,请参见此处:感谢您提供的信息。RStudio似乎不允许使用破折号或
!!要包含在标题中的omap
。它将正确运行第一个选项(此处为html)并删除
!!omap
行,但在选择word时(现在列为
-word\u document
它将在列表顶部插入第三个全新选项:
'-word\u document:“默认值”
和错误输出
word\u document中的错误:一元运算符调用的无效参数:->创建输出格式->eval->eval执行暂停使用(滥用?)R的YAML包的omap选项,通过这种方式加载YAML文件会创建一个有序的映射,而不是根据标准映射。可能会联系RStudio开发人员并提出替代解决方案(例如,通过一些配置文件选项).RStudio在YAML中进行了其他更改-它使用!expr对表达式求值,并将其替换为当前值。3个月前,他们已确认该错误,并假定已在日常版本中修复该错误,但该行为仍出现在1.0.136版中。您可以使用
render()
是否可以从控制台执行功能?
title: "Untitled"
output: !!omap
- html_document: default
- word_document: default