2015-01-07 3 views
5

Одна из особенностей, которые мне очень нравятся в Sweave, - это возможность иметь \ SweaveInput {} отдельных файлов Sweave для получения более «модульного» отчета и просто иметь возможность комментировать части отчета, которые я не хочу сгенерирован с одним #\SweaveInput{part_x} вместо того, чтобы комментировать или блокировать целые блоки кода. Недавно я решил переехать в R Markdown по многим причинам в основном практичности, возможности интерактивной (блестящей) интеграции в отчете и того факта, что мне действительно не нужны расширенные параметры форматирования LaTeX. Я обнаружил, что технически pandoc может комбинировать несколько файлов Rmd в один вывод html, просто конкатенируя их, но было бы неплохо, если бы это поведение можно было вызвать из «основного» Rmd-файла.Есть ли уценка R уставки SweaveInput {} для модульной генерации отчетов?

Любой ответ был бы очень признателен, даже если он просто «вернется в Sweave, это невозможно в Markdown».

Я использую R 3.1.1 для Windows и Linux, а также Rstudio 0.98.1056 и Rstudio server 0.98.983.

+1

Я бы сказал, что это ответ, но я не использую \ SweaveInput, поэтому не уверен, отвечает ли это на это. Но эта ссылка выглядит полезной: http: // yihui.name/knitr/demo/child/ – Dason

+0

Спасибо за вход, ответ Дитера ниже показывает, что это действительно путь. –

ответ

6

использовать что-то вроде этого в главном документе:

```{r child="CapsuleRInit.Rmd"} 
``` 
```{r child="CapsuleTitle.Rmd", eval=TRUE} 
``` 
```{r child="CapsuleBaseline.Rmd", eval=TRUE} 
``` 

Используйте eval=FALSE пропустить одного ребенка.

Для пользователей RStudio вы можете определить основной документ для выхода латекса, но это не работает для документов RMD, поэтому вам всегда нужно переключиться на основной документ для обработки. Пожалуйста, поддержите мой запрос функции RStudio; Я пробовал уже два раза, но мне кажется, что слишком мало людей используют дочерние документы, чтобы поместить их выше в список приоритетов.

+1

Как я могу поддержать ваш запрос функции? –

+0

Не было бы смысла представить запрос функции [здесь] (https://github.com/yihui/knitr/issues)? – Dason

+0

Я уже подал один и поддержал другой запрос кого-то другого. Это не особенность knitr, поэтому ссылка, которую Дасон дал, не является подходящим местом, а скорее RSTudio. –

1

Я не совсем понимаю некоторые термины в ответе выше, но решение относится к определению пользовательского трикотажа: крючок в заголовке 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 
``` 

структура каталога будет содержать папку верхнего уровня с

  1. конечный выходной Workbook.html
  2. resources подпапки, содержащей workbook_style.css
  3. 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)} 
``` 
Смежные вопросы