R Markdown でコードの折り畳みをチャンクごとに選択可能にした (rmarkdown 1.15)

by
カテゴリ:
タグ:

html_document ではコードの折り畳みができる.使い方は簡単で,YAMLフロントマターにて code_folding を指定するだけだ1

showhideの場合は,後からソースコードごとにボタンで表示を切り替えることができる.

しかし,デフォルトで全て表示か非表示かではなく,特定のソースコードだけデフォルトで表示させてあとは隠す,あるいはその逆をやりたいという要望があった (Issue #644).

なんと2016年から塩漬けでいいねが36個もあったのでできるようにした (PR #1602).するとマージしてもらった上に rmarkdown の contributor に迎え入れてもらえた!

というわけで以下で使い方を紹介する. GitHub 版の rmarkdown パッケージで利用可能だ.

使い方

既定で全て非表示にして一部を表示する

code_folding: hide により全てのチャンクのソースコードを既定で非表示にしつつ,表示したいソースコードは HTML 出力時に fold-show クラスを持つようにすればよい.例えばチャンクオプションに class.source="fold-show" と指定する.

---
output:
  html_document:
    code_folding: hide
---


```{r}
# このソースコードは非表示
```


```{r, class.source="fold-show"}
# このソースコードは表示される
```

既定で全て表示して一部を非表示にする

これは若干トリッキー.

先述の場合と同様に code_folding: hide しつつ, knitr::opts_chunk() を利用をして全てのチャンクのソースコードが既定で fold-show クラスを持つようにする.

knitr::opts_chunk$set(class.source = "fold-show")

すると code_folding: hide にも拘らず,全てのチャンクのソースコードが既定で表示されるようになる.

しかし,fold-show クラスを持たないソースコードは非表示にできるので,非表示にしたいソースコードを持つチャンクに対しては class.source=NULL としてクラス属性を初期化してやればよい.別に NULL でなくとも fold-show クラスを持たなければよいので, class.source="fold-hide" などとしてやると,明示的でいいかも知れない.

---
output:
  html_document:
    code_folding: hide
---


```{r setup, opts.include=TRUE}
knitr::opts_chunk$set(class.source = "fold-show")
```


```{r}
# このソースコードは表示される
```


```{r, class.source=NULL}
# このソースコードは非表示
```


```{r, class.source="fold-hide"}
# このソースコードは非表示
```

PR 内容

fold-show クラスを持つソースコードの扱いを変更するよう,JavaScriptを一行書き換えただけの簡単なお仕事 (PR #1602).

- if (show)
+ if (show || $(this)[0].classList.contains('fold-show'))

そう見えるだけで JavaScript の知識がなくて, console.log() をソースコードに仕込んだ rmarkdown パッケージをインストールして Rmd ファイルを knit しまくるとう面倒な作業を繰り返しました.

ブラウザの開発者ツールに直接 JavaScript をぶち込んでいけば挙動を確認できることに気付き,随分挙動の理解が楽になりました.

変更は単純ながら実装には1時間ほど使ったと思います.

もっと実力をあげねば.

Yihui が PR を Approve してくれた後,NEWS を書いてくれと言われました.普段伝わればいいと思って適当な英語を書いている人間にはなかな大変でした.過去の NEWS を参考に書きましたが, thanks, @atusy と自演するのが照れ臭かったです.Push すると Yihui が修正を加えてくれました.感謝.

Enjoy!


  1. code_folding が使えるチャンクはソースコードがR,Python,Bash,SQL,C++,Stan,Juliaで記述されている場合に限られる.↩︎