有条件地在Bookdown中包含各章

时间:2019-03-14 14:15:31

标签: r r-markdown bookdown

假设我有一个名为index.Rmd的主R-Markdown文件和另一个名为child.Rmd的R-Markdown文件。如果我想基于条件params$value1 > params$value2包含R-Markdown文件child.Rmd,则可以将以下代码添加到文件index.Rmd

condition <- params$value1 > params$value2
filepathToChild <- "/home/user/child.Rmd"
```{r conditional_print, 
child=filepathToChild , eval = condition
}
```

使用bookdown,我可以创建一个名为_bookdown.yml的文件,其内容如下:将文件child.Rmd的内容包括在文件索引的内容之后。Rmd:

rmd_files: ["index.Rmd", "child.Rmd"]

如何根据条件params$value1 > params$value2将book.Rmd文件的内容包括在书本中?

1 个答案:

答案 0 :(得分:2)

我想不出在yml中执行此操作的解决方案,但是您可以通过编程方式创建该yml文件,并将其与渲染过程结合起来。

只需创建一个简单的脚本即可生成.yml文件并进行渲染:

# compile_my_book.R

# get the parameters
param1 <- commandArgs(trailingOnly = TRUE)[1]
param2 <- commandArgs(trailingOnly = TRUE)[2]

# just some dummy yml from bookdown examples
my_yml <- paste0(
"book_filename: 'my-book.Rmd'
before_chapter_script: ['script1.R', 'script2.R']
output_dir: 'book-output'
clean: ['my-book.bbl', 'R-packages.bib']"
)

# list the files
# (here you could also use list.files to get them automatically, sorting them etc.)
my_files <- c("chapter01.Rmd", "chapter02.Rmd", "References.Rmd")

# add your conditional files
if (param1 > param2) my_files <- c(my_files, "conditional.Rmd")

# create the _bookdown.yml
cat(my_yml,
    "\nrmd_files: ['", paste0(my_files, collapse = "', '"), "']",
    file = "_bookdown.yml", sep = "")

# render your book with the arguments you want (excluding the values you want to check for)
bookdown::render_book('index.Rmd', 'bookdown::gitbook')

然后您可以从命令行编译该书:

Rscript compile_my_book.R value1 value2

(或创建一个makefile或类似的东西来为您运行多件事)

因此,运行Rscript compile_my_book.R 1 2不会添加条件文件,但是Rscript compile_my_book.R 2 1会添加条件文件。

这有点棘手,但是我正在使用类似的工作流程,通过从多个来源读取数据,检查某些条件并创建配置文件,为我使用的某些Web应用程序创建长的.xml-config文件。