使用Rmarkdown中的参数设置文档标题

60

我有一个Rmarkdown模板,它运作良好,而且我已经参数化了它,所以我可以从不同的数据源生成同一报告的变体。然而,我希望在每种情况下更改报告的标题。我应该怎么做?

这是我目前拥有的YAML头:

---
title: "My Title"
author: "Me, Inc."
date: "August 4, 2015"
output: pdf_document
params:
  title: default
---

我尝试在调用rmarkdown::render时使用params=list(title="ASDF"),虽然我的代码可以看到这个变量,但标题没有改变。我还尝试在YAML中使用r params$title,但是那会产生语法错误。

有其他的方法吗?谢谢!

3个回答

103

尝试使用第二个YAML元数据块,并将参数化的元数据放在其中。

我成功地运行了以下代码(即,从参数列表生成文档标题):

---
output: html_document
params: 
    set_title: "My Title!"
---

---
title: `r params$set_title`
---

RMarkdown文档指出,Pandoc会合并YAML元数据块。使用第一个块来定义参数集,并使用第二个块将参数用作元数据。Knitr将执行R代码以解释第二个块中的参数。然后,Pandoc将合并元数据块。

更新(2017):

可以在单个块中完成此操作,如下所示:

---
output: html_document
params: 
    set_title: "My Title!"
title: "`r params$set_title`"
---

这是因为标题出现在params定义之后。我在行内R代码周围加上引号,以防止“扫描器错误”。


15
只要在 params 声明之后加上 title: ...,你就可以使用单个 YAML 块来完成它。 - eipi10
5
如果出现“Scanner error”错误,您可能需要在反引号两侧加上引号(即将值转换为YAML解析器的字符串)。 - blmoore
10
如果想要基于数据中的变量动态创建标题(根据数据来源可能会更改),那么该如何修改这个例子中的文本字符串"My Title!"? - Lloyd Christmas
我不确定是我的设置问题,但当我在set_title中使用逻辑时,我必须像上面的原始答案一样使用第二个YAML元块。 - chandler
3
在运行一些代码后,比如导入和转换数据之后,这也适用,使用2个YAML块中的第一个选项。 @Lloyd Christmas - MS Berends

10

这是一个更简化的动态标题挑战解决方案。

将标题从顶部声明中分离出来,像这样:

从这里开始:

---
title: "Sample Title"
output: pdf_document
---

变为:

---
output: pdf_document
--- 

```{r}
title_var <- "Sample Title"
```

---
title: `r title_var`
---

在R代码块中,声明title_var变量。现在标题保存在变量中。希望这有所帮助!

3

我将此答案添加到这里,因为它有助于使R Markdown标题动态化。

只需使用!r后跟定义的对象名称(在下面的示例中为test_title)即可使标题动态化。

---
output: pdf_document
params:
set_title: !r test_title
---
---
title: `r params$set_title`
---

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