如何在渲染时将optparse参数传递给R-markdown文件?

时间:2017-11-21 09:01:27

标签: r r-markdown rscript optparse

我有一个Report.Rmd文件,它生成一个pdf。 在.Rmd文件中我有一些optparse的代码,它从Rscript接收一个参数来使用:

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(optparse)
# get user as option 
option_list <- list(
  make_option(
  c("-u", "--u"), 
  type = "character", 
  default = "username"))
# parse accountId
parser <- OptionParser(
  usage = "%prog [options] file",
  option_list = option_list,
  add_help_option = F)
args <- parse_args(parser, positional_arguments = TRUE)
opt <- args$options
```

当我把这段代码(减去```和knitr)放在file.R中并用Rscript运行它时:

Rscript file.R -u abcd

代码使用abcd作为变量opt$u的值。

问题是,我需要从命令行创建一个pdf,而使用optparse参数。我可以通过以下方式生成pdf:

Rscript -e "rmarkdown::render('Report.Rmd')

哪个工作正常,但没有opt$u的正确值。 那么,如何将-u参数添加到Rscript中? 我试过像Rscript -e "-u abcd;rmarkdown::render('Report.Rmd')这样的东西,它给了我ERROR: option '-e' requires a non-empty argumentRscript -e "-u abcd" -e "markdown::render('Rapportage.Rmd')"给了我同样的错误。如何解决这个问题??

编辑:解决方法可能是调用file.R,将用户名写入.RData,然后在.Rmd中加载.RData。但我希望有一种更简单,更清洁的方式......

1 个答案:

答案 0 :(得分:1)

因此,当OP和我一起思考时,可以使用params rmarkdown::render()参数在渲染过程中传递参数。 它需要一个命名参数列表。为了使其工作,您必须在YAML标头中设置相同的参数。

示例:

这是我们的文件file.Rmd

---
title: "MWE"
output: pdf_document
params:
  myName: ""
---

```{r color, results='markup'}
print(params$myName)
```

现在我们可以使用

传递myName参数的值
rmarkdown::render("file.Rmd", params = list(myName = "Martin"))

请注意,在控制台中渲染时,必须在R命令中转义引号:

Rscript -e "rmarkdown::render(\"file.Rmd\", params = list(myName = \"abcd\"))"