2016-12-08 2 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=FALSEpurlのために何を意味するのか全くわからないけど、どちらか、echo=TRUE動作しません。 purl=TRUEおよび/またはeval=TRUEも同様に生成する。

ここで何かを誤解していますか? purlは、knitというコードが出力されるだけでいいですか?

答えて

1

これが私が回避策として行ったことです。実行したくないチャンクの場合、.html.R出力に含めるために、purl = TRUEと指定しました。

であり、その後、通常の方法であるが、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) 
} 
関連する問題