如何在自定义Rmarkdown中存储嵌入文件(包括)

时间:2017-11-23 13:42:50

标签: r r-markdown

我根据此blogpost在Rmarkdown中创建了自己的格式。我在我的个人包装中实现了它,效果很好。我还在includes html_document参数中添加了自定义文件。

我的问题是在点击“编织”按钮后是否可以存储我的自定义文件(包含在includes参数中)。与self_contained = F选项类似,它允许存储所有Rmarkdown依赖项。

更新

我应该先给你一些背景信息。假设我在两个月前使用html格式创建报告。两周后,我决定以html格式实施重大更改并更新我的包。

在接下来的两周之后,我的老板来找我,要求在旧报告中添加一些细微的变化。然后,点击Knit按钮,报表无法创建,因为我的html格式的新版本有很大差异。

我看到了如何处理这个请求的三种可能性。我可以安装旧版本的软件包(次优),每次实施重大更改时创建一个新的html格式,或者我可以存储我的依赖项(页眉,页脚,css文件)一个单独的子目录(如packrat)。然后每个报告都是独立的,不受我自定义格式的变化的影响。

让我知道是否有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

基本示例

假设您有一个myreport.Rmd文件,其中包含以下标题:

---
title: "Untitled"
author: "Romain Lesur"
date: "27 janvier 2018"
output: 
  html_document:
    includes:
      in_header: inheader.html
---

使用hacky rmarkdown预处理器,您可以复制inheader.html文件 以下代码旨在在R控制台中运行:

pre_processor <- function(metadata, 
                          input_file, 
                          runtime, 
                          knit_meta, 
                          files_dir, 
                          output_dir) {

  in_header <- metadata$output$html_document$includes$in_header
  if (!is.null(in_header)) file.copy(in_header, output_dir)

  invisible(NULL)
}

custom_output_format <- function() {
  rmarkdown::output_format(
    knitr = NULL,
    pandoc = NULL,
    pre_processor = pre_processor,
    base_format = rmarkdown::html_document()
  )
}

rmarkdown::render('myreport.Rmd', 
                   output_format = custom_output_format(), 
                   output_dir = 'output')

您将获得一个output目录,其中包含已呈现的报告和inheader.html文件。

要点击Knit按钮运行类似的预处理器,您必须将其包含在个人包output_format中(见下文)。

提交包裹

正如问题提到的那样blogpost,这里是quarterly_report函数的改编:

quarterly_report <- function(toc = TRUE) {

  # get the locations of resource files located within the package
  css <- system.file("reports/styles.css", package = "mypackage")
  header <- system.file("reports/quarterly/header.html", package = "mypackage")

  # call the base html_document function
  base_format <-
    rmarkdown::html_document(toc = toc,
                             fig_width = 6.5,
                             fig_height = 4,
                             theme = NULL,
                             css = css,
                             includes = includes(before_body = header))

  pre_processor <- function(metadata,
                            input_file,
                            runtime,
                            knit_meta,
                            files_dir,
                            output_dir) {
    purrr::walk(c(css, header), file.copy, output_dir)

    invisible(NULL)
  }

  rmarkdown::output_format(
    knitr = NULL,
    pandoc = NULL,
    pre_processor = pre_processor,
    base_format = base_format
  )
}

这个解决方案不是100%令人满意,因为我不认为rmarkdown pre_processor是因为产生副作用而创建的。但它的确有效。