Я не совсем понимаю некоторые термины в ответе выше, но решение относится к определению пользовательского трикотажа: крючок в заголовке YAML. Для многодольных документов это позволяет, например:
- имеют «главный» или «корень» Rmarkdown файл с
output: markdown_document
YAML заголовок
- делают все дочерние документы RMD ⇒ Md перед вызовом
render
, или нет, если это время ограничения
- объединить несколько файлов (с возможностью ребенка код чанка) в один (например, для глав в отчете)
- записи
output: html_document
(или другой формат) заголовки YAML для этого выхода компиляции на лету , добавив к уценке эффективно запись нового файла Rmarkdown
- ... затем вынести этот Rmarkdown, чтобы получить выход, удаление промежуточных файлов в процессе при желании
Код для всех указанных выше (dumped here) является описал here, сообщение, которое я написал после того, как в последнее время выработал пользовательский крюк заголовка YAML knit:
(here).
Функция пользовательского knit:
(то есть замена rmarkdown::render
) в приведенном выше примере:
(function(inputFile, encoding) {
input.dir <- normalizePath(dirname(inputFile))
rmarkdown::render(input = inputFile, encoding = encoding, quiet=TRUE,
output_file = paste0(input.dir,'/Workbook-tmp.Rmd'))
sink("Workbook-compiled.Rmd")
cat(readLines(headerConn <- file("Workbook-header.yaml")), sep="\n")
close(headerConn)
cat(readLines(rmdConn <- file("Workbook-tmp.Rmd")), sep="\n")
close(rmdConn)
sink()
rmarkdown::render(input = paste0(input.dir,'/Workbook-compiled.Rmd'),
encoding = encoding, output_file = paste0(input.dir,'/../Workbook.html'))
unlink(paste0(input.dir,'/Workbook-tmp.Rmd'))
})
... но все выдавливается на 1 линии!
Остальная часть файла 'master'/'root'/'control' или то, что вы хотите вызвать, заботится о написании вышеупомянутого YAML для окончательного вывода HTML, который проходит через промежуточный файл Rmarkdown, и его второй фрагменте кода программно присоединяет дочерние документы через вызов list.files()
```{r include=FALSE}
header.input.file <- "Workbook-header.yaml"
header.input.dir <- normalizePath(dirname(header.input.file))
fileConn <- file(header.input.file)
writeLines(c(
"---",
paste0('title: "', rmarkdown::metadata$title,'"'),
"output:",
" html_document:",
" toc: true",
" toc_depth: 3 # defaults to 3 anyway, but just for ease of modification",
" number_sections: TRUE",
paste0(" css: ",paste0(header.input.dir,'/../resources/workbook_style.css')),
' pandoc_args: ["--number-offset=1", "--atx-headers"]',
"---", sep="\n"),
fileConn)
close(fileConn)
```
```{r child = list.files(pattern = 'Notes-.*?\\.md')}
# Use file names with strict numeric ordering, e.g. Notes-001-Feb1.md
```
структура каталога будет содержать папку верхнего уровня с
- конечный выходной
Workbook.html
resources
подпапки, содержащей workbook_style.css
- A
documents
подкаталога, содержащего указанный основной файл "Workbook.Rmd" рядом файлы с именами, как "Notes-001.Rmd", "Записка-002.Rmd" и т.д. (для обеспечения fileglobbing на list.files(pattern = "Notes-.*?\\.Rmd)
находок и, таким образом, делает их ребенок в правильном порядке при отображении главного Workbook.Rmd
файла)
Чтобы получить правильную нумерацию файлов, каждый из составляющих «Notes-XXX.Rmd» файл должен содержать следующий стиль YAM L заголовок:
---
title: "March: Doing x, y, and z"
knit: (function(inputFile, encoding) { input.dir <- normalizePath(dirname(inputFile)); rmarkdown::render(input = inputFile, encoding = encoding, quiet=TRUE)})
output:
md_document:
variant: markdown_github
pandoc_args: "--atx-headers"
---
```{r echo=FALSE, results='asis', comment=''}
cat("##", rmarkdown::metadata$title)
```
Код кусок в верхней части документа Rmarkdown вводит название YAML в качестве заголовка второго уровня при оценке. results='asis'
указует вернуть обычный текст-строку, а не
[1] "A text string"
Вы бы связать каждый из них , прежде чем вязания основного файла - это проще снять требование, чтобы сделать все дочерние документы и просто добавить их предварительно полученные уценки вывод.
Я описал все это по вышеприведенным ссылкам, но я думал, что это было бы плохой способ не оставлять фактический код с моим ответом.
Я не знаю, насколько эффективным может быть веб-сайт с запросом на функцию RStudio ... Лично мне не трудно было изучить исходный код этих функций, который, к счастью, open source, и если действительно есть что-то отсутствует, а не недокументированный запрос функций с внутренней обработкой, вероятно, гораздо более эффективен для одного из их разработчиков программного обеспечения.
Я не знаком с Sweave, было ли выше, чем вы стремились? Если я правильно понимаю, вы просто хотите контролировать включение документов модульным способом. Оператор child = list.files()
может позаботиться о том, что: если не через файловое глобусирование, вы можете выровнять файлы списка как child = c("file1.md","file2md")
... и переключить этот оператор, чтобы изменить их. Вы также можете управлять TRUE/FALSE выключателями YAML, причем наличие пользовательского заголовка будет установить несколько детей, которые будут включены, например
potentially.absent.variable: TRUE
... над документом с молчаливым include=FALSE
скрывается происки первого chunk:
```{r include=FALSE}
!all(!as.logical(rmarkdown::metadata$potentially.absent.variable)
# ==> FALSE if potentially.absent.variable is absent
# ==> FALSE if anything other than TRUE
# ==> TRUE if TRUE
checkFor <- function(var) {
return !all(!as.logical(rmarkdown::metadata[[var]])
}
```
```{r child = "Optional_file.md", eval = checkFor(potentially.absent.variable)}
```
Я бы сказал, что это ответ, но я не использую \ SweaveInput, поэтому не уверен, отвечает ли это на это. Но эта ссылка выглядит полезной: http: // yihui.name/knitr/demo/child/ – Dason
Спасибо за вход, ответ Дитера ниже показывает, что это действительно путь. –