Условно включать главы в Bookdown

#r #r-markdown #bookdown

#r #r-markdown #bookdown

Вопрос:

Предположим, у меня есть основной файл R-Markdown с именем index.Rmd и другой файл R-Markdown с именем child.Rmd. Если я хочу включить дочерний файл R-Markdown.Rmd основываясь на условии params$value1 > params$value2 , я могу добавить следующий код в индекс файла.Rmd

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

Используя bookdown, я могу создать файл с именем _bookdown.yml со следующим содержимым, чтобы включить содержимое дочернего файла.Rmd после содержимого файла index.Rmd:

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

Как я могу включить содержимое дочернего файла.Rmd в bookdown на основе условия params$value1 > params$value2 ?

Ответ №1:

Я не могу придумать решение, чтобы сделать это на 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 делает это.

Это немного халтурно, но я использую похожие рабочие процессы для создания файлов long .xml-config для некоторых веб-приложений, которые я использую, путем считывания данных из нескольких источников, проверки некоторых условий и создания файла конфигурации.

Ответ №2:

Другой способ — просто поместить весь код вашей главы в другой Rmd (child2.Rmd), чтобы вызвать его в child.Rmd и добавить условие оценки :

 ```{r, child= 'child.Rmd',eval=params$value1 > params$value2}
```
  

И вы ничего не меняете в своем yml.