rmarkdown:如何以编程方式操作块选项?

10

是否有可能以编程方式操作代码块选项,并基于修改后的文档进行 knit

我有一些rmarkdown文件,想要使用purl将所有代码(甚至包含eval=FALSE的代码)都包括进来。

目前,我最好的猜测是可以(1)使用 sedeval=FALSE 替换为 eval=TRUE,然后(2)purl。但如果有更好的方法就更好了,例如:

parsed_rmd <- knitr::parse_rmd('my_rmarkdown.rmd')
for (chunk in parsed_rmd) {
 chunk$eval <- TRUE
}
knitr::purl(parsed_rmd, output = 'my_rmarkdown_as_r.R'

可能是条件性的 `echo` (或 eval 或 include) 在 rmarkdown 块中的重复问题。 - Karolis Koncevičius
这不是重复的问题。那个问题是说“有没有办法在Rmd文件开头设置一个开关...” - 我的问题不是要求修改Rmd文件,而是如何操作我无法修改的Rmd文件的处理过程。 - DavidC
如果Rmd文件中有变量(例如eval=doEval)在这些位置上,那么您可能可以执行eval <- FALSE; knit("file.Rmd")而无需进一步更改Rmd文件。这样行得通吗? - Karolis Koncevičius
我不想改变 Rmd 文件。 - DavidC
但是你不是也在使用 sed 改变它吗?你似乎需要一种方法来为 eval 设置全局值,然后禁止在每个块中再次本地更改该值。我不确定是否可能,但也许其他人可以对此发表评论。 - Karolis Koncevičius
没错,如果必要的话,我会用sed在临时文件中进行更改。但是绝对不想手动更改它。(如果必须使用sed来更改,我觉得与其使用你的eval=doEval,还不如直接在我的临时文件中设置eval=TRUE。) - DavidC
1个回答

6
你可以将“eval”块选项设置为基于参数的逻辑条件。
创建一个Rmarkdown(.Rmd)文件,并在YAML标题中定义参数:
params:
     eval_optional: no

设置“eval”选项用于代码块,您可能不想显示以测试此参数的值:

```{r optional_code, eval= (params$eval_optional == "Yes")}
# chunk with code you only want to show sometimes
```

然后,使用适当的参数调用rmarkdown_render

rmarkdown::render(file = "myreport.rmd", params = list(eval_optional = "yes")

请参阅http://rmarkdown.rstudio.com/developer_parameterized_reports.html,了解有关使用参数的更多信息。


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