考虑以下test.Rmd
:
```{r setup, purl=FALSE}
opts_chunk$set(purl=FALSE)
opts_template$set(nopurl = list(purl=FALSE))
```
```{r test1}
print(1)
```
```{r test2, opts.label='nopurl'}
print(2)
```
```{r test3, purl=FALSE}
print(3)
```
purl('test.Rmd')
给出了test.R
,其中没有任何test *块应该被清除,但是:
## ----test1---------------------------------------------------------------
print(1)
## ----test2, opts.label='nopurl'------------------------------------------
print(2)
尽管有全局选项test3
和标签opts_chunk$set(purl=FALSE)
,但只有nopurl
未被清除,其余部分都会被清除。
为什么呢?
答案 0 :(得分:2)
这不是一个bug,只是purl()
没有执行任何代码块,所以第一个代码块并没有真正执行。 purl()
功能在很多方面都不可靠,请参阅?knitr::hook_purl
。也就是说,我不建议完全删除文件;编织更可靠(参见?knitr::purl
中的注释部分)。
答案 1 :(得分:1)
根据Yihui的反馈,走的路是如下:
```{r setup, purl=FALSE}
knit_hooks$set(purl = hook_purl)
opts_template$set(nopurl = list(purl=FALSE))
opts_template$set(dopurl = list(purl=TRUE))
```
```{r test}
print(1)
```
```{r test2, opts.label='nopurl'}
print(2)
```
```{r test3, opts.label='dopurl'}
print(3)
```
使用这种方法,您不需要:
purl('test.Rmd')
你只是:
knit('test.Rmd')
并获取通常的test.md
和test.R
文件。后者如下:
## ----test----------------------------------------------------------------
print(1)
## ----test3, opts.label='dopurl'------------------------------------------
print(3)
如您所见,给定knit_hooks$set(purl = hook_purl)
,块的默认行为是purling。
在实际使用中nopurl
和dopurl
将收集更多选项与(无)清除一起设置。
无论如何,在考虑以下说明时:
N.B。无法保证'purl()'生成的R脚本 可以重现'knit()'中完成的计算。 'knit()' 进程可能相当复杂(块的特殊值 选项,自定义块挂钩,除R之外的计算引擎,以及 'envir'论证等)。如果要重现计算 在'knit()'生成的报告中,请务必使用'knit()', 而不是仅执行'purl()'生成的R脚本。 这似乎是显而易见的,但有些人却没有得到它。
总是使用knit_hooks$set(purl = hook_purl)
并在不需要purl时设置purl=FALSE
似乎是明智之举。