【问题标题】:How to pass an optparse argument to a R-markdown file while rendering?如何在渲染时将 optparse 参数传递给 R-markdown 文件?
【发布时间】:2023-03-23 01:08:01
【问题描述】:

我有一个 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。但我希望有一种更简单、更清洁的方法......

【问题讨论】:

  • 您可以分两步完成,使用您的参数调用 R 脚本来生成/更改 Rmd,然后编织 Rmd。 (stackoverflow.com/questions/28507693/…)
  • 这意味着我必须创建一个 file.R ,创建 .Rmd ...问题是,我不知道该怎么做,我不确定它是否更容易比使用 file.R 生成正确的值,将其写入 .RData,并在 .Rmd 呈现时将 .RData 作为环境加载...?
  • 并使用渲染的params 参数? render("file.Rmd", params = list(myArg = "abcd"))。在 Rmd 中,您可以使用 params$myArg 获取它。
  • 如果我这样做Rscript -e "rmarkdown::render('Rapportage.Rmd', params = list(myArg="raoul"))",我会得到Error in filter_impl(.data, quo) : Evaluation error: object 'params' not found. Calls: &lt;Anonymous&gt; ... &lt;Anonymous&gt; -&gt; filter -&gt; filter.tbl_df -&gt; filter_impl -&gt; .Call
  • 不确定,但也许您还必须在 YAML 中定义 myArg:List of named parameters that override custom params specified within the YAML front-matter

标签: r r-markdown rscript optparse


【解决方案1】:

因此,正如 OP 和我一起发现的那样,可以使用 rmarkdown::render()params 参数在渲染过程中传递参数。 它需要一个命名参数列表。为了使其工作,您必须在 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\"))"

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 2019-07-11
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2017-07-29
    • 2012-03-15
    相关资源
    最近更新 更多