从概念上讲,我想做这样的事情:
---
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
值。在渲染完整文档时,这当然不是问题,但如果我想(无论出于何种原因)以交互方式运行一些块(不一定按顺序),这会很烦人。
因此,有没有一种方法可以在另一个参数的定义中使用另一个参数?
我认为这并不完全令人满意,但一种方法是使用
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))
给予:
y
,您也可以尝试将其指定为字符串,然后在 Rmd 文件中的代码块内对其进行评估。你必须要么
params$y
以外的其他内容,例如仅
y
,或
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
```
结果: