2017-04-05 46 views
2

RStudio將重新排列YAML中的輸出列表,具體取決於編織下拉按鈕中最後選擇了哪個選項。使用RStudio編織按鈕時,爲什麼YAML中的輸出順序發生變化?

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

上面的YAML頭部給出了將RMarkdown編譯爲word或html的選項。它會給你在頂部的主要選項,在這種情況下,html_document

當下拉菜單用於選擇備用輸出時,例如, word_document,輸出的順序會改變,像這樣:

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

我假設(由喬納森和凱文樂於助人的言論在前面的問題),這是由於RStudio讀取RMarkdown並給出了路上下文按鈕,但是,我很好奇,如果這種重新排序可以'關閉'不知何故?

這是一個動機是版本控制。這改變了文本文檔,該文檔註冊爲修改並因此強制提交或恢復。

+1

可以在不更改的情況下使用YAML標題,但不能使用knitr按鈕,你必須使用'rmarkdown :: render'命令,請看這裏:http://stackoverflow.com/questions/39662365/knit-one-markdown-file-to-two-output-files/39663872#39663872 –

回答

3

也就是說的線變化的順序肯定是版本控制的問題,但是根據YAML說明書中映射的鍵是無序的和加載傾銷不能保證得到相同的值

一些庫轉儲映射通過按鍵的排序值,但這不是必需的,對於除了所有鍵都是相同類型並且可以排序的映射之外的任何東西都沒有多大意義。

因此,假設解析器符合標準,那麼您可以從兩個示例中加載的YAML完全相同。如果鍵值的順序是顯著,正確的方法是使單個鍵 - 值映射關係的列表(破折號可以,但不必縮進):

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

和可選放在標籤!!omap,以確保這是一個有序圖:

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

當然,可能RStudio 使用各行的順序在映射(我在ruamel.yaml的Python這樣做我自己封裝以允許在不進行按鍵重新排序的情況下進行往返)。但更正確的方法是使用!!omap,或以某種其他方式指示選定的密鑰或密鑰的順序。

+0

感謝您的信息。看起來RStudio不允許破折號或'!! omap'被包含在標題中。它會正確運行第一個選項(這裏爲html),並移除'!! omap'這一行,然後選擇一個單詞(現在列爲' - word_document'),它會在頂部插入第三個全新的選項:'' - word_document':default'和出錯'error in -word_document:一元運算符的無效參數 調用: - > create_output_format - > eval - > eval 執行暫停# – DaveRGP

+1

@DaveRGP它看起來像RStudio根據[參考手冊](https://cran.r-project.org/web)使用(濫用?)R的YAML包的omap選項,這樣加載YAML文件將創建一個有序地圖,而不是正常地圖。 /packages/yaml/yaml.pdf)。也許聯繫RStudio開發者並提出一個替代解決方案是可能的(例如,通過一些配置文件選項)。 – Anthon

+0

RStudio在YAML中做了其他修改 - 它評估表達式!expr,並用當前值替換它們。他們已經承認了這個錯誤[報告在這裏](https://support.rstudio.com/hc/en-us/community/posts/209422797-YAML-dynamic-header-getting-munged-by-rmarkdown-rstudio),據稱修復它在3個月前的日常構建中,但行爲仍然出現在版本1.0.136 – DonJ

0

這是一個非常煩人的問題。

我主要使用nb.html,但有時我想編織PDF。

只要我編織PDF:

  • 我必須手動重新排列輸出,否則nb.html可能不再保存。
  • 我必須恢復我在輸出字段中的任何評論,因爲它們全部自動刪除。

到目前爲止,我的最佳解決方案是在下面的塊中保留YAML標題的乾淨副本。

這很醜陋,但我嘗試了更復雜的解決方案,如r表達式。它們失敗,因爲RStudio檢查YAML標題中的文字「html_notebook」字段(參見In r studio, how does the IDE treat notebooks with the 'preview' button),因此沒有乾淨的解決方法

+0

您可能可以使用控制檯中的'render()'函數嗎? – DaveRGP

相關問題