2014-12-13 47 views
4

考慮以下test.RmdKnitr:不要金銀絲一大塊

```{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,其中沒有測試*塊是應該purled,但是:

## ----test1--------------------------------------------------------------- 
print(1) 


## ----test2, opts.label='nopurl'------------------------------------------ 
print(2) 

只有test3不是祕密,其餘的都是祕密,儘管全球選項opts_chunk$set(purl=FALSE)和標籤nopurl
爲什麼?

+0

看起來像一個bug給我。 – Thomas 2014-12-14 20:31:02

+0

@Thomas:同意,希望Yihui能讀到這裏解決疑問。 – antonio 2014-12-14 21:11:20

回答

1

基於一匯反饋,要走的路就像如下:

```{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將收集更多的選項與(無)purling一起設置。
無論如何,當考慮以下注意事項:

N.B.不能保證由'purl()' 生成的R腳本可以重現在'knit()'中完成的計算。 'knit()' 進程可能相當複雜(特殊值爲塊 選項,自定義塊鉤子,除R以外的計算引擎,以及參數'envir'等)。如果您想在由'knit()'生成的報告中重現計算 ,請務必使用'knit()', 而不是僅執行由'purl()'生成的R腳本。 這似乎很明顯,但有些人卻不明白。

當purl不需要時總是使用knit_hooks$set(purl = hook_purl)並設置purl=FALSE似乎是明智的。

+0

問題是,如果不存在需要與添加'purl = FALSE'一樣多的類型,並且透明度較低,則添加'opts.label' – MichaelChirico 2017-01-13 18:36:48

2

這不是一個bug,但只是purl()沒有執行任何代碼塊,所以第一個代碼塊沒有真正執行。 purl()功能在很多方面都不可靠,請參閱?knitr::hook_purl。也就是說,我不建議完全清理文檔;編織更可靠(請參閱?knitr::purl中的註釋部分)。

+0

好的,這是信息豐富的,在一個層面上是有道理的。然而,我很困惑,爲什麼'purl'甚至是一種選擇。我真的不明白這有什麼用處。 – Thomas 2014-12-17 19:28:18

+0

@Thomas它出於歷史原因(文學編程,編織,糾結等等)。現在我發現它根本沒用。 – 2014-12-17 23:42:29