2016-12-08 105 views
2

在我看來,knitr::purl不處理塊引用。見例如大塊引用與knitr :: purl

cat(' 
```{r label, eval = FALSE} 
print("Second: hello world!") 
``` 

This is first. 

```{r ref.label = "label", echo = FALSE} 
``` 
', file = "test.Rmd") 

現在我們都用knitpurl處理此。

knitr::knit("test.Rmd", "test.md") 
knitr::purl("test.Rmd", "test.R") 

cat(readLines("test.md"), sep = "\n") 

#> ```r 
#> print("Second: hello world!") 
#> ``` 
#> 
#> This is first. 
#> 
#> 
#> ``` 
#> ## [1] "Second: hello world!" 
#> ``` 

cat(readLines("test.R"), sep = "\n") 

#> ## ----label, eval = FALSE--------------------------------------------- 
#> ## print("Second: hello world!") 
#> 
#> ## ----ref.label = "label", echo = FALSE------------------------------- 
#> 

我不完全知道什麼echo=FALSE裝置purl,但echo=TRUE不工作,要麼。 purl=TRUE和/或eval=TRUE也產生相同的結果。

我誤解了一些東西嗎? purl不應該只輸出knit運行的代碼嗎?

回答

1

這是我做的解決方法。對於我不想運行的組塊,但希望包含在輸入I的指定purl = TRUE.html.R中,例如,

```{r label, eval = FALSE, purl = TRUE} 
server <- function(input, output, session) { 
    rvs <- reactiveValues(data = NULL) 
    # ... 
} 
``` 

然後提到他們通常的方式,而是用purl = FALSE例如

```{r ref.label = label, purl = FALSE, echo = FALSE} 
``` 

,然後使用該後處理功能,以取消對具有部分purl = TRUE

postprocess <- function(file) { 

    lines <- readLines(file) 

    include <- grep("^## ---.*purl = TRUE.*$", lines) 
    empty <- grep("^\\s*$", lines, perl = TRUE) 

    do_chunk <- function(start) { 
    start <- start + 1L 
    if (start > length(lines)) return() 
    ## first empty line after start 
    end <- empty[empty >= start][1] 
    if (is.na(end)) end <- length(lines) 
    lines[start:end] <<- sub("^## ", "", lines[start:end]) 
    } 

    lapply(include, do_chunk) 

    writeLines(lines, con = file) 
}