对于模块化报告生成,是否存在\ SweaveInput {}的R降价模拟?

时间:2015-01-07 15:33:44

标签: r rstudio pandoc sweave r-markdown

我在Sweave中非常喜欢的一个功能是选择让单独的Sweave文件的\ SweaveInput {}具有更多的"模块化"报告,只是能够注释掉我不希望用单个#\SweaveInput{part_x}生成的报告部分,而不必评论整个代码块。 最近我决定转向R Markdown有多种原因,主要是实用性,报告中交互式(Shiny)集成的选项以及我并不真正需要LaTeX的广泛格式化选项。 我发现技术上pandoc能够通过连接它们将多个Rmd文件合并到一个html输出中,但是如果可以从一个" master" Rmd文件。

任何答案都会非常感激,即使它只是"回到Sweave,在Markdown"中是不可能的。

我正在使用R 3.1.1 for Windows和Linux以及Rstudio 0.98.1056和Rstudio服务器0.98.983。

2 个答案:

答案 0 :(得分:6)

在主文档中使用类似的内容:

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

使用eval=FALSE跳过一个孩子。

对于RStudio用户:您可以为乳胶输出定义主文档,但这对RMD文档不起作用,因此您始终必须切换到主文档进行处理。请支持我对RStudio的功能请求;我已经尝试了两次,但在我看来,很少有人使用子文档将其放在优先级列表中。

答案 1 :(得分:1)

我不太明白上面答案中的一些术语,但解决方案涉及定义自定义编织:YAML标头中的钩子。对于多方文档,这允许您,例如:

  • 拥有带有output: markdown_document YAML标题的“主要”或“根”Rmarkdown文件
  • 在调用render之前从Rmd⇒md渲染所有子文档,如果这是时间限制的话,则不显示
  • 将多个文件(带有子代码块选项)组合成一个(例如,用于报告中的章节)
  • 动态编写此编译输出的output: html_document(或其他格式)YAML标题,在markdown之前有效地编写新的Rmarkdown文件
    • ...然后渲染此Rmarkdown以获取输出,如果需要,删除过程中的中间文件

上述所有代码(dumped here)的代码都是here,我在最近编制了自定义knit: YAML标头挂钩的用法后编写了一篇文章({{3} })。

上例中的自定义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,用于通过中间Rmarkdown文件传输的最终HTML输出,以及它的第二个代码chunk通过调用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
  3. workbook_style.css子文件夹
  4. 包含所述主文件“Workbook.Rmd”以及名为“Notes-001.Rmd”,“Notes-002.Rmd”等文件的documents子文件夹(以确保{{1}上的文件加载}渲染并因此在渲染主list.files(pattern = "Notes-.*?\\.Rmd)文件时
  5. 时以正确的顺序使它们成为子项

    要获得正确的文件编号,每个成分“Notes-XXX.Rmd”文件应包含以下样式的YAML标题:

    Workbook.Rmd

    Rmarkdown文档顶部的代码块在评估时作为二级标题输入YAML标题。 --- 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) ``` 表示返回纯文本字符串而不是

    results='asis'

    你会在编织主文件之前编织每个 - 更容易删除渲染所有子文档的要求,只需附加预先生成的降价输出。

    我已经在上面的链接中描述了所有这些,但我认为如果不将实际代码留给我的回答是不礼貌的。

    我不知道RStudio功能请求网站的效果如何......我个人认为很难查看这些功能的源代码,谢天谢地here,如果有的话实际上是缺席而不是未记录的内部工作知情功能请求可能更容易被他们的软件开发人员操作。

    我对Sweave不熟悉,上面是你的目标吗?如果我理解正确,您只想以模块化方式控制文档的包含。 [1] "A text string" 语句可以解决这个问题:如果不通过文件通配符,您可以将列表文件直接列为child = list.files() ...并切换该语句以更改子项。您还可以使用YAML控制TRUE / FALSE开关,因此自定义标头的存在会设置一些子项,例如

    child = c("file1.md","file2md")

    ...在文档上方,隐藏着potentially.absent.variable: TRUE 隐藏第一个块的阴谋:

    include=FALSE