Knitr:不要编织一个代码块

5
请考虑以下的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已经设置为不编织。
为什么呢?


对我来说似乎是个bug。 - Thomas
@Thomas:同意,希望 Yihui 能看到这里并解决疑惑。 - antonio
2个回答

2

根据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),块的默认行为是编织。

在实际使用中,nopurldopurl将收集更多选项以与(无)编织一起设置。
无论如何,在考虑以下注意事项时:

N.B.不能保证由'purl()'生成的R脚本可以复制'knit()'中执行的计算。'knit()'过程可能相当复杂(块选项的特殊值,自定义块钩子,除R之外的计算引擎和'envir'参数等)。如果要在由'knit()'生成的报告中复制计算,请务必使用'knit()'而不仅仅执行由'purl()'生成的R脚本。这似乎很明显,但有些人就是不明白。

因此,似乎明智始终使用knit_hooks$set(purl = hook_purl)并在不需要编织时设置purl=FALSE


问题在于,如果不存在 opts.label ,添加它所需的输入与添加 purl = FALSE 一样多,但可读性较差。 - MichaelChirico
我认为这种方式非常复杂,只是完成一项基本任务。要完成一个任务,需要:knit_hooks$setopts_templates$set x2!然后是 opts.label。而且根本不清楚 hook_purl 是从哪里来的。 - spindoctor
我刚刚测试了一下。为了使一个块自动进行purl操作,必须删除以下行:opts_template$set(dopurl = list(purl=TRUE)) - spindoctor

2

这并不是一个bug,只是purl()没有执行任何代码块,所以第一个代码块实际上并没有被执行。 purl()函数在很多方面都不可靠,建议使用?knitr::hook_purl代替。话虽如此,我并不建议完全使用purl来处理文档;相比之下,knitting更加可靠(请参见?knitr::purl中的注意事项部分)。


好的,从某种程度上来说这很有用并且十分明确。然而,我对于为什么“purl”是一个选项感到困惑。我真的看不出它有什么用处。 - Thomas
@Thomas 这只是出于历史原因(文学编程,编织,交错等等)。现在我发现它完全没有用处。 - Yihui Xie

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