R Bookdown _bookdown.yml

时间:2016-11-26 14:10:57

标签: r r-markdown bookdown

Bookdown有很多配置选项,我发现很难理解如何知道某个选项是否存在,以及这些选项背后的逻辑。

具体来说,我发现很难描述_bookdown.yml中的选项,因为至少有两个其他地方可以说明选项:

  • _output.yml
  • bookdown::render_book等函数调用的参数。

在我看来,_bookdown.ymlbookdown::render_book等函数的参数之间存在任何类型的1对1映射,因此_bookdown.yml似乎不仅仅是记录功能调用选项的不同方式。

我们可以在源代码中看到`_bookdown.yml'正在控制某些config options但不是全部。

所以 - 重新解释这个问题 - 为什么_bookdown.yml是一个单独的配置文件,以及它应该包含什么的定义?

举一个有代表性的例子,有一个chapter_name选项可以在_bookdown.yml中使用。我有以下问题:

  1. 我们如何知道这是一个选项,因为它未在文档here中或在示例here中引用。
  2. 一旦我们知道它存在,我怎么知道它有什么影响?是否所有这些选项都传递给其他包(例如pandoc,rmarkdown)?我可以找到chapter_name引用的唯一地方是bookdown的CRAN源代码,即使在那里我也无法弄清楚它是如何被使用的。
  3. 请注意,作者对_bookdown.yml的讨论是here,但我仍然不完全理解。

1 个答案:

答案 0 :(得分:9)

以下是对代码库进行调查的一些结果:

我们可以看到bookdown::render_book中的'config'变量来自_bookdown.yml here,通过名为load_config的函数填充,可在utils.R中找到}。

load_config似乎做了两件事 - 它将config的内容存储在名为opts的主选项列表中,其中config只是一个元素,然后返回config元素。

请注意,opts最初定义为here。它是从knitr:::new_defaults创建的,可以找到here

然后config变量出现在代码库的多个部分中。

following code具有代表性:

  if (is.na(new_session)) {
    new_session = FALSE
    if (is.logical(config[['new_session']])) new_session = config[['new_session']]
  }

所以我们可以看到,如果new_session作为函数参数直接传递给bookdown::render_book,则使用它。否则,会尝试从_bookdown.yml文件中加载它。

config作为bookdown::render_book中的参数传递了很多。例如,我们可以看到它在utils.R中的source_files函数中使用。

我们得出什么结论? _bookdown.yml允许您填充bookdown包的全局选项列表。每当您看到config(列表)正在使用代码库时,您可以通过填充_bookdown.yml

来设置此列表的元素

我还没有设法找到可以在_bookdown.yml中指定的选项的完整列表,但有一种方法可以轻松找到可能的search for examples on Github