gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:04:40 24 4
gpt4 key购买 nike

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

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

更新

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

接下来的两周后,我的老板来找我,要求在旧报告中添加一些小改动。然后,通过单击 Knit 按钮,无法创建报表,因为我的 html 格式有一个新版本,有显着不同。

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

如果有更好的解决方案请告诉我。

最佳答案

基本示例

假设您有一个包含以下 header 的 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 是为了产生副作用而创建的。但它有效。

关于r - 如何在自定义 Rmarkdown 中存储嵌入文件(包含),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47456968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com