我根据此blogpost在Rmarkdown中创建了自己的格式。我在我的个人包装中实现了它,效果很好。我还在includes
html_document
参数中添加了自定义文件。
我的问题是在点击“编织”按钮后是否可以存储我的自定义文件(包含在includes
参数中)。与self_contained = F
选项类似,它允许存储所有Rmarkdown依赖项。
更新
我应该先给你一些背景信息。假设我在两个月前使用html
格式创建报告。两周后,我决定以html
格式实施重大更改并更新我的包。
在接下来的两周之后,我的老板来找我,要求在旧报告中添加一些细微的变化。然后,点击Knit
按钮,报表无法创建,因为我的html
格式的新版本有很大差异。
我看到了如何处理这个请求的三种可能性。我可以安装旧版本的软件包(次优),每次实施重大更改时创建一个新的html
格式,或者我可以存储我的依赖项(页眉,页脚,css文件)一个单独的子目录(如packrat)。然后每个报告都是独立的,不受我自定义格式的变化的影响。
让我知道是否有更好的解决方案。
答案 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
是因为产生副作用而创建的。但它的确有效。