Knitr:不要乱扔一块

时间:2014-12-13 18:06:36

标签: r knitr r-markdown

考虑以下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未被清除,其余部分都会被清除。 为什么呢?

2 个答案:

答案 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.mdtest.R文件。后者如下:

## ----test----------------------------------------------------------------
print(1)

## ----test3, opts.label='dopurl'------------------------------------------
print(3)

如您所见,给定knit_hooks$set(purl = hook_purl),块的默认行为是purling。

在实际使用中nopurldopurl将收集更多选项与(无)清除一起设置。
无论如何,在考虑以下说明时:

  

N.B。无法保证'purl()'生成的R脚本   可以重现'knit()'中完成的计算。 'knit()'   进程可能相当复杂(块的特殊值   选项,自定义块挂钩,除R之外的计算引擎,以及   'envir'论证等)。如果要重现计算   在'knit()'生成的报告中,请务必使用'knit()',   而不是仅执行'purl()'生成的R脚本。   这似乎是显而易见的,但有些人却没有得到它。

总是使用knit_hooks$set(purl = hook_purl)并在不需要purl时设置purl=FALSE似乎是明智之举。