无法直接将`params`传递到rmarkdown::render()函数中。

4

阅读完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
)
}
1个回答

3

需要在 yaml 头部预定义参数(带或不带默认值)。

---
params:
  doc_title:
  date:
  site_number:
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)
```

rmarkdown::render(
  "69831130.Rmd",
  params = list(doc_title="hello", date=Sys.Date(), site_number=111L)
)

rendering of rmarkdown document


1
谢谢你,r2evans。我想将参数作为render()的参数传递,而不是在YAML头中指定它们。我正在尝试理解引用参考中的这句话:“如果YAML字段和参数都存在,则参数中的参数值将覆盖YAML中对应的参数。”这似乎意味着我不应该有YAML参数。所以,我很困惑;你是说我仍然需要像所示那样在YAML头中指定参数吗? - phargart
那么您的意思是只有在头文件中定义了默认值的参数才会传递到文档中?这个更改是什么时候引入的?我不认为一年前rmarkdown是这样工作的。 - lith
如果你尝试使用上述文档和 rmarkdown::render(..., params=list(site_number=1, quux=2))来实现这个目标,那么它将会失败并出现以下信息:Error: render params not declared in YAML: quux。我认为这是相当明确的,不确定这种行为何时发生变化。 - r2evans
@phargart,回答你的问题...在params=参数中列出的任何内容都必须在rmarkdown文档的yaml头中定义。不是yaml头中的所有内容都需要包含在“params=”参数中。从我的答案中应该清楚地表明,我预定义了空变量;如果不立即明显它们必须在yaml header中预定义,那么当一个人尝试删除其中一个并重新渲染时,会出现错误,因此应该就会明白。 - r2evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接