阅读完R Markdown Cookbook中关于参数化报告的部分之后,我试图自己实现它们。我创建了一个名为“work_formatting.Rmd”的简单R Markdown示例,并添加了一些参数。
---
title: "`r params$doc_title`"
author: "Paul M. Hargarten"
---
Date Generated: `r params$date`
# Header 1
Blah blah blah text
```{r cars}
cat("For site ", params$site_number, "\n")
summary(cars)
```
然后尝试将其呈现出来。
number <- c(100, 200, 300)
for(i in 1:3){
rmarkdown::render(
input = "work_formatting.Rmd",
output_file = paste0("word_formatting_", number[i], ".docx"),
output_format = my_word(),
params =list(
doc_title = paste("Some_title"),
date = lubridate::today(),
site_number = number[i]
),
clean = TRUE,
quiet = FALSE
)
}
但我收到了这个错误
processing file: work_formatting.Rmd
|.................. | 12%
inline R code fragments
Quitting from lines 2-8 (work_formatting.Rmd)
Error in eval(parse_only(code), envir = envir) :
object 'params' not found
如果我先定义params
(如下所示),则可以按预期创建单词文档。我认为这个解决方案可行是因为render()
使用的默认环境是parent.frame()
,因此可以找到全局对象params
。然而,我很困惑,因为这个解决方案与只将它们添加为render()
的参数不同,请参考R Markdown食谱中的参考资料。是否有其他人遇到了这些错误?是否有人知道有没有避免创建全局params
对象的方法?
number <- c(100, 200, 300)
for(i in 1:3){
params = list(
doc_title = paste("Some_title"),
date = lubridate::today(),
site_number = number[i]
)
print(params)
rmarkdown::render(
input = "work_formatting.Rmd",
output_file = paste0("word_formatting_", number[i], ".docx"),
output_format = my_word(),
params = params,
clean = TRUE,
quiet = FALSE
)
}
render()
的参数传递,而不是在YAML头中指定它们。我正在尝试理解引用参考中的这句话:“如果YAML字段和参数都存在,则参数中的参数值将覆盖YAML中对应的参数。”这似乎意味着我不应该有YAML参数。所以,我很困惑;你是说我仍然需要像所示那样在YAML头中指定参数吗? - phargartrmarkdown::render(..., params=list(site_number=1, quux=2))
来实现这个目标,那么它将会失败并出现以下信息:Error: render params not declared in YAML: quux
。我认为这是相当明确的,不确定这种行为何时发生变化。 - r2evansparams=
参数中列出的任何内容都必须在rmarkdown文档的yaml头中定义。不是yaml头中的所有内容都需要包含在“params=”参数中。从我的答案中应该清楚地表明,我预定义了空变量;如果不立即明显它们必须在yaml header中预定义,那么当一个人尝试删除其中一个并重新渲染时,会出现错误,因此应该就会明白。 - r2evans