在YAML头部评估R代码

10

请看下面的Rmd文件,

---
title: "Untitled"
author: "baptiste"
date: "`r Sys.Date()`"
output: html_document
test: "`r paste('_metadata.yaml')`"
---

```{r}
cat(rmarkdown::metadata$test)
```

输入图像描述

在将日期传递给 pandoc 进行转换为 Markdown 和 HTML 之前,R 会处理(编织)日期。然而,自定义字段 test 则未求值。

有什么区别呢?是否可以强制 knitr/rmarkdown 对 YAML 头中的任意字段进行求值?

注意:实际目的不只是像这个虚拟示例中那样print()一个文件名,而是要加载包含元数据(作者信息)的外部 YAML 文件,用 R 处理它,并输出将插入文档的字符串。

2个回答

4

它确实评估了代码。如果您使用foo.Rmd运行

rmarkdown::render("foo.Rmd", clean = FALSE)

您会看到一个中间文件(pandoc输入文件),名为foo.knit.md。它的内容如下:

---
title: "Untitled"
author: "baptiste"
date: "2017-08-12"
output: html_document
test: "_metadata.yaml"
---


```r
cat(rmarkdown::metadata$test)
```

```
## `r paste('_metadata.yaml')`
```

我不知道如何从文档内部查看它(你的示例显示metadata$test无效),但可能有一些诀窍可以解决。


谢谢,我应该检查md输出而不是依赖于这个文档很少的 rmarkdown::metadata - baptiste

4

标准元数据字段data和您自定义的字段test实际上没有任何区别。以下是代码示例:

---
title: "Untitled"
author: "baptiste"
date: "`r Sys.Date()`"
output: 
  html_document: 
    keep_md: yes
test: "`r paste('_metadata.yaml')`"
---

```{r}
cat(rmarkdown::metadata$date)
cat(rmarkdown::metadata$test)
```

以下是翻译的结果:

导致以下输出:

enter image description here

如您所见,date也未被评估。我在rmarkdownknitr包中没有找到任何功能。但是下面这个简单的函数至少可以解决您简单示例的问题:

---
title: "Untitled"
author: "baptiste"
date: "`r Sys.Date()`"
output: 
  html_document: 
    keep_md: yes
test: "`r paste('_metadata.yaml')`"
---

```{r}
eval_meta <- function(x) eval(parse(text = gsub("`|r", "", x)))
eval_meta(rmarkdown::metadata$date)
eval_meta(rmarkdown::metadata$test)
```

在这里输入图片描述

然而,这是否适用于您更为复杂的情况,则是另一个问题。


1
好观点,谢谢!我没想到要检查那个,这个逻辑对我有点迷惑。 - baptiste
1
非常好的回答。然而,正则表达式模式可以用 "(^\r\s+)|(`$)" 更好。否则,在调用中的r字母会被吞噬,例如fo mat()`。 - strboul

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