使用 rmarkdown::render 设置文档 header(标题、作者、日期)

Using rmarkdown::render to set document header (title, author, date)

我正在使用 rmarkdown::render("script.r") 创建 R 脚本的 HTML 版本。输出以 script.r 作为标题,我作为作者登录,当前 date 作为日期。我不想泄露我的登录名,也不想泄露我的工作时间表..

我知道这个元数据(标题、作者、日期)可以在 Rmd 文件内的 YAML 块中设置,但我想避免 creating/editing 这个文件,并且只使用原始 R 脚本。

有没有办法通过 rmarkdown::renderknitr::opts_chunk$set 等其他函数设置(标题、作者、日期)元数据?

或者,可以在 R 脚本中设置此元数据吗?

请避免建议我改为编写 Rmd 文件..

Rmarkdown 文档(请参阅 ?compile_notebook)描述了一种通过在 script.R 文件中包含特殊格式的注释来执行此操作的方法。

例如,在您的脚本中包含此注释以设置标题、作者和日期。

#' ---
#' title: "Crop Analysis Q3 2013"
#' author: "John Smith"
#' date: "May 3rd, 2014"
#' ---

这将为您提供以下输出:

我不知道这是否是一个特别好的解决方案,但评论太长了,所以就这样吧。我查看了 rmarkdown::render,我认为除非您自己重新定义 render,否则您想要的是不可能的。查看第 85 行及以后:

metadata <- paste("\n", "---\n", "title: \"", input, 
                  "\"\n", "author: \"", Sys.info()[["user"]], "\"\n", 
                  "date: \"", date(), "\"\n", "---\n", sep = "")
if (!identical(encoding, "native.enc")) 
  metadata <- iconv(metadata, to = encoding)
cat(metadata, file = knit_input, append = TRUE)

这不受任何条件的控制。所以一个混乱的方法是重新定义 render 并替换它的其中一行。我借用了这个问题的有用答案:Editing R functions

body(render)[[25]] <- substitute(
  if (identical(tolower(tools::file_ext(input)), "r")) {
    spin_input <- intermediates_loc(file_with_meta_ext(input, 
                                                   "spin", "R"))
    file.copy(input, spin_input, overwrite = TRUE)
    intermediates <- c(intermediates, spin_input)
    spin_rmd <- knitr::spin(spin_input, knit = FALSE, envir = envir, 
                        format = "Rmd")
    intermediates <- c(intermediates, spin_rmd)
    knit_input <- spin_rmd

    # Our edited code starts here!
    metadata <- paste("\n", "---\n", "title: \"", getOption("yaml_title"), "\"\n", 
                  "author: \"", getOption("yaml_author"), "\"\n", "date: \"", 
                  getOption("yaml_date"), "\"\n", "---\n", sep = "")
    # Our edited code ends here!

    if (!identical(encoding, "native.enc")) 
      metadata <- iconv(metadata, to = encoding)
    cat(metadata, file = knit_input, append = TRUE)
  }
)

现在,我的文件junk.r如下:

plot(mtcars$mpg, mtcars$hp)

现在 render("junk.r") 给了我...

现在您可以使用 options 将您自己的条目用于标题、作者 and/or 日期或将其留空。当然,编辑 .r 文件或创建 .Rmd 文件会更容易,但您已经排除了这些。