使用 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::render
或 knitr::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 文件会更容易,但您已经排除了这些。
我正在使用 rmarkdown::render("script.r")
创建 R 脚本的 HTML 版本。输出以 script.r 作为标题,我作为作者登录,当前 date
作为日期。我不想泄露我的登录名,也不想泄露我的工作时间表..
我知道这个元数据(标题、作者、日期)可以在 Rmd
文件内的 YAML 块中设置,但我想避免 creating/editing 这个文件,并且只使用原始 R 脚本。
有没有办法通过 rmarkdown::render
或 knitr::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 文件会更容易,但您已经排除了这些。