2013-05-08 2 views
17

私は/ PURLスクリプトにRチャンクを抽出するための文書をもつれにどのような方法があります:knitr - `purl(...)`からチャンクを除外しますか?

  • は(名前で言う)任意のチャンクを除外?
  • もしそうでなければ、eval=F(またはチャンクフック/オプションinclude=Fを定義できます)の場合はチャンクを除外しますか?たとえば、

、私は以下のRMDがあるとします。

```{r setup, echo=F} 
library(MASS) 
``` 
First, we perform the setup (assume for some reason I need to evaluate `setup` 
silently before I wish to display the chunk to the user, hence the repetition) 
```{r setup, eval=F} 
``` 

Here's the function I've been explaining: 
```{r function} 
plus <- function (a, b) a + b 
``` 

And here's an example of its use: 
```{r example} 
plus(1, 2) 
``` 

もつれたスクリプトは次のようになります。

## @knitr setup, echo=F 
library(MASS) 

## @knitr setup, eval=F 
library(MASS) 

## @knitr function 
plus <- function (a, b) a + b 

## @knitr example 
plus(1, 2) 

私は私以来、」なかったのだという考えを持っていますtは、特定のチャンクが評価されることを望んでいますが、少なくとも出力に現れてはいけません(上記の例ではth e second setupチャンク)。

さらに、絡み合った出力に関して、いくつかのチャンクを「見えない」とマークするとよいでしょう。私はexampleチャンクを出力スクリプトに入れたくないのですが(ドキュメントの目的でRmdでうまくいきましたが、plus関数を使用したい場合はRmdをつぶしてからsource('myfile.r')の機能を使いたいと思っています。これらの余分な例を実行する心配はありません。現在、私はRmdをつまんでを手動で私はちょうどドキュメントとスクリプトの両方を提供する1つのRmdを書くという原則に反して、余分な努力。)

+0

注意してチャンクをマーキング '= F'が 'purl''d出力から削除されますが、*も* RMD(からであるgithubのからknitrのバージョンに含まれますこれは私の 'example'ブロックには理想的ではありません(ここでは、* Rmdに*含まれ、purl'd出力から削除されます) –

+0

確かにたくさんの余裕がありますより頻繁に使用されないので、よく開発されていない 'purl()'の改良 –

+0

Rmdからr個の塊を抽出する方法はありませんか? – KLDavenport

答えて

20

knitr 1.3以降、purl()に特定のコードチャンクを含める/除外できる新しいチャンクオプションpurl = TRUE/FALSEがあります。機能が「doesnの; -

```{r test, purl=FALSE} 
library(MASS) 
``` 
7

もつれ処理ブロックが現在のparamsを展開しませんが、我々はそれがそうすることができます...

# See `?trace` documentation for details. 
bdy <- as.list(body(knitr:::process_tangle.block)) 
trace.at <- which(grepl(".*opts_chunk\\$merge.*", 
         as.list(body(knitr:::process_tangle.block)))) 
tracer <- quote({ 
    # Code borrowed from normal chunk procesing. 
    af = opts_knit$get('eval.after'); al = opts_knit$get('aliases') 
    if (!is.null(al) && !is.null(af)) af = c(af, names(al[af %in% al])) 
    for (o in setdiff(names(params), af)) params[o] = list(eval_lang(params[[o]])) 
    # Omit this if using lastest knitr source from github. 
    if(isFALSE(params$include)) { 
    tmp <- knit_code$get(); 
    tmp[[params$label]] <- ""; 
    knit_code$restore(tmp) 
    } 
}) 

trace(knitr:::process_tangle.block, tracer=tracer, at=trace.at, print=FALSE) 

そして、裏編み()除外はオプションの引数を使用して制御することができます...

```{r setup, echo=TRUE, results='hide'} 
library(MASS) 
```` 

First, we perform the setup (assume for some reason I need to evaluate `setup` 
silently before I wish to display the chunk to the user, hence the repetition) 
```{r setup2, ref.label="setup", echo=FALSE, results='markup'} 
``` 

Here's the function I've been explaining: 
```{r function} 
plus <- function (a, b) a + b 
``` 

And here's an example of its use: 
```{r example, eval=!opts_knit$get("tangle") } 
plus(1, 2) 
``` 

And here's another example of its use: 
```{r example2, include=!opts_knit$get("tangle") } 
plus(3, 3) 
``` 
+0

しかし、これはまだ* (私が質問で与えた例では、私は 'example'チャンクを除外したい) –

+0

@ mathematical.coffee、editを参照してください。今はうまくいくはずです。 – Thell

+0

@ mathematical.coffee @Thellは探検に感謝します。私は、別のチャンクオプションを追加して、特定のチャンクを 'purl()'から除外できるようにすると思います。これについてもっと考えさせてください。 –

3

これは解決策よりもトリックですが、あなたはまだいくつかの正規表現と裏編み起因するスクリプトを変更することができます。例えば

次の関数(おそらく正規表現のための簡単な解決策がある)で:

dropchunks <- function(scriptname, what.to.drop){ 
    script <- readLines(scriptname) 
    script <- do.call(paste, list(script, collapse = "\n")) 
    subpattern = paste0("(", do.call(paste, list(what.to.drop, collapse="|")), ")") 
    mainpattern <- paste('(?s)## @knitr ((?!## @knitr).)*?', subpattern, '.*?((?=## @knitr)|$)', sep="") 
    script <- gsub(pattern = mainpattern, replacement = "", x = script, perl=TRUE) 
    writeLines(text = script, con= scriptname) 
} 

あなたが、その後はeval = Fを含む全てのコードチャンクを削除するには、この操作を行うことができます。

library(knitr) 
purl("test.Rmd") 
dropchunks("test.R", "eval=F") 

"function"または "example"という名前のチャンクを削除することができます(実際には、これらの単語を含むチャンクはどこかで削除されますが、これは正規表現を変更することで変更できます)。

+0

私はアイデアが好きです! knitrはチャンク内の未知のargsについては不平を言っていないので、単純な '' {r test、purl = F}をデフォルトの "what.to.drop"として設定することができます。 – Thell

関連する問題