参数化 Rmarkdown:在参数 B 的定义中使用参数 A 的值

问题描述 投票:0回答:2

从概念上讲,我想做这样的事情:

---
title: Fun With Params
output: html_document
params:
   x: 1
   y: !r params$x + 1
--- 

```{r}
params
```

也就是说,我想在另一个参数的定义中使用一个参数的值。

这不起作用。它渲染时带有

Error
:

Error in eval(expression) : object 'params' not found
Calls: <Anonymous> -> eval -> eval

Warning message:
In yaml::yaml.load(yaml, handlers = knit_params_handlers(evaluate = evaluate),  :
  an error occurred when handling type 'r'; using default handler

文档如下所示:

基本上,这告诉我,在解析 YAML 标头时,

params
尚不存在,并且
parms$x
无法评估,因此它仅返回字符串。

我可以分配一个默认值(

NULL
)并将逻辑推送到我的第一个块。然而,这有一个恼人的缺点,在 RStudio 中我不应该忘记运行这个块以获得正确的
params$y
值。在渲染完整文档时,这当然不是问题,但如果我想(无论出于何种原因)以交互方式运行一些块(不一定按顺序),这会很烦人。

因此,有没有一种方法可以在另一个参数的定义中使用另一个参数?

r r-markdown knitr
2个回答
2
投票

我认为这并不完全令人满意,但一种方法是使用

dplyr::lst()
,它允许顺序构建对象。然而,这将导致嵌套参数对象。

---
title: Fun With Params
output: html_document
params: 
  myparams: !r dplyr::lst(x = 1, y = x + 1)
--- 

```{r}
params
```

或者,您可以在 YAML 标头中放置一些占位符,并用

render()
调用替换它们:

---
title: Fun With Params
output: html_document
params:
  x: NA
  y: NA
--- 

```{r}
params
```

并使用:

rmarkdown::render("funwithparams.rmd", params = dplyr::lst(x = 1, y = x + 1))

给予:


0
投票
无论如何,这都不是一个完美的解决方案,但是如果您想根据其他参数的值定义一个参数

y

,您也可以尝试将其指定为字符串,然后在 Rmd 文件中的代码块内对其进行评估。你必须要么

  1. 将参数称为

    params$y

    以外的其他内容,例如仅
    y
    ,或

  2. 解锁

    params

     绑定并将 
    params$y
     替换为求值表达式。

像这样:

--- title: Fun With Params output: html_document params: x: 1 y: "params$x + 1" --- ```{r} # Alternative 1: params$y y <- eval( parse( text = params$y ) ) y # Alternative 2: bindingIsLocked("params", env = .GlobalEnv) unlockBinding("params", env = .GlobalEnv) params$y <- eval( parse( text = params$y ) ) params$y ```
结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.