web-dev-qa-db-ja.com

R Markdownで条件付きでテキストのブロックを表示する

私はknitrを使用してR Markdownドキュメントを解析しています。 knitrに渡す環境の変数に応じて、R Markdownでテキストのブロックを条件付きで表示する方法はありますか?

たとえば、次のようなものです。

`r if(show.text) {`
  la la la
`r }`

show.textがtrueの場合、結果のドキュメントに「la la la」を出力します。

27
andrew

完全なR式が必要なため、表示するように複数のブロックに分割することはできませんが、ブロックの結果がテキスト文字列の場合は、そのまま(引用符なしで)含まれるため、何かを実行できるはずです。お気に入り:

`r if(show.text){"la la la"}`

show.textTRUEの場合にのみ、テキストが含まれます。

37
Greg Snow

「eval」チャンクオプションを使用してこれを行うことができます。 http://yihui.name/knitr/options/ を参照してください。

```{r setup, echo=FALSE}
show_text <- FALSE
````

```{r conditional_block, eval=show_text}
print("this will only print when show.text is TRUE")
```

私は [〜#〜] yaml [〜#〜] 構成ファイルを使用してマークダウンレポートをパラメーター化し、再利用しやすくしています。

```{r load_config}
library(yaml)
config <- yaml.load_file("config.yaml")
```

...

```{r conditional_print, eval=config$show_text}
print("la la la")
````
20
Paul Boardman

すべてのテキストを別のファイルに入れ、メインファイルから次のようにインクルードすることで、これを行うのが最も簡単です。

```{r conditional_print, child='text.Rmd', eval = show_text}
```

これには、インラインRステートメントやその他のチャンクを子ファイルに入れることができるという利点があります。そのため、オプションのテキストとして何を数えるかについて気が変わっても、プロジェクトをリファクタリングする必要はありません。

16
jkeirstead

以下は、出力に適切なマークアップを提供する、Paul Boardmanへの微調整のアプローチです。

```{r setup, echo=FALSE}
show_text <- FALSE
```

```{r conditional_block, echo=FALSE, results='asis', eval=show_text}
cat("## Hey look, a heading!

lorem ipsum dolor emet...")
```

さらに良いのは、pythonエンジンを呼び出して出力を生成する場合、三重引用符を使用すると、特別なことをしなくても、一重引用符または二重引用符を含むテキストを簡単に処理できます。

```{python, conditional_block_py, echo=FALSE, results='asis', eval=show_cond_text}
print("""
## Still a heading

Block of text with 'single quotes' and "double quotes"
""")
```
12
David Marx

上記の解決策は、テキストの大きなブロックに対しては少し不格好であり、特定の状況には適さない場合があります。いくつかの質問がある生徒用のワークシートを作成し、同じ.Rmdファイルを使用して、ソリューションを含むファイルを生成するとします。基本的なLaTeXフロー制御を使用しました:

``` {r, include = F}
# this can be e.g., in a parent .Rmd and the below can be in child
solution <- TRUE 
```
\newif\ifsol
\sol`r ifelse(solution, 'true', 'false')`

その後、私は行うことができます:

What is $2 + 2$

\ifsol
4
\fi

このようにして、次を使用して代替テキストブロックを作成することもできます。

\ifsol
Alternative 1
\else
Alternative 2
\fi
3
Milan Valášek

Rmdファイルを前処理する関数my.render()を定義しようとしましたが、commentout引数に応じて、HTMLコメントコード(TRUE)をRmdファイルに保持しますまたはそれらを削除します(FALSE)。次に、前処理されたRmdファイルを_tmp.Rmd_に書き込み、通常のrender()関数を使用します。

_my.render <- function(input, commentout=FALSE, ...) {
  if (commentout == FALSE) {
    ## Delete the HTML comment lines from code
    txt <- readLines(input)
    txt[grepl(" *<!-- *| *--> *", txt)] <- ""
    write.table(txt, file="tmp.Rmd", sep="\n", quote=FALSE, row.names=FALSE, col.names=FALSE)
    render("tmp.Rmd", output_file=sub("Rmd","html",input), ...)
  } else {
    render(input, output_file=sub("Rmd","html",input), ...)
  }
}
_

うまくいったようです。例えば。

_<!--
This text with formulas $\alpha+\beta$ is visible, when commentout=FALSE.
-->
_
0