R 克尼特:不要吐一大块
考虑以下R 克尼特:不要吐一大块,r,knitr,r-markdown,R,Knitr,R Markdown,考虑以下测试.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')给
测试.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*块应该被purl,但是:
## ----test1---------------------------------------------------------------
print(1)
## ----test2, opts.label='nopurl'------------------------------------------
print(2)
只有test3
没有发出声音,其余的都发出声音,尽管全局选项opts\u chunk$set(purl=FALSE)
和标签nopurl
为什么?这不是一个bug,只是
purl()
没有执行任何代码块,所以第一个代码块没有真正执行。purl()
函数在许多方面都不可靠,请参见?knitr::hook_purl
。也就是说,我根本不建议清理文档;编织更可靠(参见?knitr::purl
中的注释部分)。根据易慧的反馈,方法如下:
```{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\u hooks$set(purl=hook\u purl)
,块的默认行为是purling
在实际使用中,nopurl
和dopurl
将收集更多选项,与(无)purling一起设置。无论如何,在考虑以下注意事项时: 注意:不能保证由“purl()”生成的R脚本 可以重现在“knit()”中完成的计算。“knit() 过程可能相当复杂(块的特殊值 选项、自定义块挂钩、除R之外的计算引擎以及 “envir”论点等)。如果你想重现计算结果 在“knit()”生成的报告中,请确保使用“knit()”, 而不仅仅是执行由“purl()”生成的R脚本。 这似乎是显而易见的,但有些人就是不明白
当不需要purl时,最好总是使用
knit\u hooks$set(purl=hook\u purl)
并设置purl=FALSE
对我来说似乎是一个错误。@Thomas:同意,希望Yihui能读到这里并解决这个疑问。好的,这是信息性的,在一个层面上是有意义的。不过,我很困惑为什么purl
甚至是一个选项。我真的看不出它有多有用。@Thomas由于历史原因(识字编程、编织、纠结等等)。现在我发现它一点用都没有。问题是如果没有添加opts.label
,那么添加opts.label
就需要与添加purl=FALSE
一样多的输入,而且透明度较低。我发现这是一种极其复杂的方法,可以完成相当基本的任务。要完成一件事,你需要:knit\u hooks$set
,选择模板$set
x2!然后选择标签。而且它根本不清楚hook_purl的来源。我刚刚测试了这个。为了有一个默认值,以便自动清除块,必须删除以下行:opts\u template$set(dopurl=list(purl=TRUE))