【问题标题】:Evaluating R code in YAML header评估 YAML 标头中的 R 代码
【发布时间】:2018-01-20 14:48:16
【问题描述】:

考虑以下 Rmd 文件,

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

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

日期在传递给 pandoc 以转换为 md 和 html 之前由 R 处理(编织)。但是,自定义字段 test 未计算。

有什么区别?是否可以强制 knitr/rmarkdown 评估 yaml 标头中的任意字段?

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

【问题讨论】:

    标签: r yaml metadata knitr r-markdown


    【解决方案1】:

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

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

    您将看到一个名为foo.knit.md 的中间文件(pandoc 输入)被留在后面。它看起来像这样:

    ---
    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
    【解决方案2】:

    标准元数据字段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)
    ```
    

    导致以下输出:

    如您所见,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)
    ```
    

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

    【讨论】:

    • 好点,谢谢!我没想过要检查,逻辑对我来说有点令人费解。
    • 很好的答案。但是,使用"(^`r\\s+)|(`$)" 可能会更好的正则表达式模式。否则,通话中的r 字母将被吞下,例如fo mat().
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 2018-11-05
    • 2021-09-03
    • 2019-08-21
    • 2015-03-23
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多