rmarkdown中YAML中的行内R代码无法运行

10

我正在尝试在YAML前置区块中运行内联R代码,然后再让rmarkdown运行文件。但是它对我不起作用。这里有一个例子:

---
title: "**Title**"
classoption: xcolor=dvipsnames
output:
  beamer_presentation:
      slide_level: 2
      pandoc_args: [
        "--bibliography", "`r paste('path/to/bib')`"
        ]
---

<!-- slide 1 -->
## Intro ##

哪个会抛出错误:

pandoc-citeproc: could not find `r paste('path/to/bib')`

这是一个简单的例子,但突出了我的主要问题。我如何让rmarkdown在YAML前置代码中运行内联R代码?

这与以下问题类似:

2个回答

10

这是我解决问题的方法。我使用RStudio编程。奇怪的是,对于日期和csl字段,我不得不使用一种解决方案,而对于参考文献字段则需要另一种解决方案。!expr在日期或csl行中无效(对我而言)。在参考文献行中,带引号的r代码也无效(对我而言)。我将参考文献和csl文件存储在一个包(inst/docs文件夹)中。不属于该包的rmarkdown文件会使用这些文件。

---
title: "Title"
date: '`r format(Sys.time(), "%d %B, %Y")`'
output: html_document
bibliography: !expr system.file("docs", "my.bib", package = "MyPackage")
csl: '`r system.file("docs", "my.csl", package = "MyPackage")`'
---

# Introduction

Yada yada [@MyRef04].

# References

my.bib是带有MyRef04的BibTex文件。csl是样式文件。

这种情况下,一个人维护一个包,其中包含数据、代码、参考文献等。其他人可能不知道包的作者,从GitHub安装该包并编写或运行使用该包的rmarkdown文件。用户几乎肯定不使用Git或GitHub,我不希望他们在从GitHub安装包后再下载任何额外的文件。

更新:在发布上述内容后,我碰巧安装了来自GitHub的markdown,因为我需要开发版本中的某些内容。在GitHub上的rmarkdown版本'1.7.5'中,您可以在参考文献行中使用r代码:

---
title: "Title"
date: '`r format(Sys.time(), "%d %B, %Y")`'
output: html_document
bibliography: '`r system.file("docs", "my.bib", package = "MyPackage")`'
csl: '`r system.file("docs", "my.csl", package = "MyPackage")`'
---

从GitHub安装rmarkdown

library(devtools)
install_github("rstudio/rmarkdown")

谢谢!我后来发现了这个问题,但忘记在这里更新。 - Luke W. Johnston
我怎样才能在我的包的另一个部分中使用一个定义的变量,用于YAML标题? - undefined

3

我找到了一个迂回的方法来得到我想要的。我不认为Rmarkdown允许在YAML中使用R表达式/命令,可能有很好的原因。我最终做的是将所有输出yaml命令放在一个名为_output.Ryaml的文件中,如下所示:

beamer_presentation:
  slide_level: 2
  includes:
    in_header: "src/preamble.tex"
  pandoc_args: [
    "--bibliography", "`r paste('path/to/bib')`",
    "--variable", "classoption:xcolor=dvipsnames",
    "--variable", "fontsize:9pt"
    ]

然后在主要的slides.Rmd文件中,类似于以下内容:

---
title: "**Title**"
author: Luke
---

<!-- slide 1 -->
## Intro ##

然后,我可以使用R代码(放在Makefile中)生成幻灯片:

knitr::knit('_output.Ryaml', '_output.yaml')
rmarkdown::render('slides.Rmd')
unlink('_output.yaml')

看起来工作得还不错。如果有更好的想法,请告诉我!


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