#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.