戯言日記

Rの話だと思ったら唐突にサバゲーが混じってくる何か。

RMarkdownでソースコードを折り畳んで表示する

 ここ最近の業務でPythonやらC++やらHTMLやらJavaScriptやらに手を出すことになった。R解析芸人とは一体。

 ただ他言語で色々やってても解析自体は基本的にRでやってるため、報告書なんかもRMarkdownで書いているのだが、そうなるとソースコードをサンプルとして貼りたい場合がちょくちょく出てくる。
 けど普通に書くとスクロール量が急激に増えるので、なら折り畳めばいいじゃないってのが今回の内容。

 ちなみに、今回の内容はRMarkdownというよりもHTMLに近いので、その辺りを調べたい場合はこのサイトが(個人的には)便利。ちょいちょい英語読む羽目になるけど、R使ってる人は大体何とかなると思う。

developer.mozilla.org


 という訳で、一応「ソースコードの差し込み方」から書いていく。
 これはRMarkdownを使っている人ならお馴染みだと思うけど、以下のようにすれば普通に文書内に差し込める。というかRMarkdown内で色分けもしてくれるし、何なら実行もしてくれる。

```{r}
iris %>% dplyr::summarize(mean)
```


 特に設定を弄っていなければ、チャンクからはソースコードと結果が返ってくるはず。  結果を出力せずにソースコードだけ表示したい場合は、チャンクでそれぞれ指定すればいい。

```{r, echo=T, eval=F}
#コードは表示するけど答えは返さない
iris %>% dplyr::summarize(mean)
```


 ここまではR言語での例だが、RMarkdown自体はR以外も扱える。
 例えばPythonならこうすればいい。使うPythonのバージョン指定とかもできるので、コード表示と同時に出力も必要な人はググってみると便利になるかもしれない。なおR使いならreticulateで解決するとか言っちゃいけない。

```{python, echo=T, eval=F}
#ここにPythonのソースコード
```


 マイコンを使っている人だとArduinoとかの本来対応していない言語でソースコードを表示したい場合がある。この時、C++ベースの言語ならRcppでチャンクを作ればいい。ソースコードの表示だけなら色分けも含めて綺麗に表示することができるので、確認段階でも地味に助かる。
 ただし動かそうとすればエラーが起きると思われるので、忘れずに「eval=F」を入れた方がいい。

```{Rcpp, echo=T, eval=F}
//ここにC++ベースのソースコード
```


 続いて、コードの折り畳みについて。

 こちらもやること自体はシンプル。

  1. <details></details>で折り畳みたい範囲全てを挟む
  2. <summary></summary>で折り畳まれている時に表示する文言を挟む
  3. </summary></details>の間に、折り畳まれている状態では非表示になる文言を入れる

 細かい話はこの辺を見れば分かりやすい。

[https://developer.mozilla.org/ja/docs/Web/HTML/Element/details:embed:cite]


 実際に書くとこんな感じ。

<details><summary>(クリックで展開)</summary>
こんな感じ。
</details>


 試しに適当な文章でやってみる。

(家系の注文)

  1. 硬め
  2. 濃いめ
  3. 少なめ


 文章の代わりにソースコードを入れる場合は<div>で囲む必要があるとか、<div>直後の1行は開けた方がいいとかって情報を観測したけど、自分の環境で動かしてみた感じだと特に影響はなさそう……?
 でも<div>で囲むとソースコードの欄が少し上にずれるみたいなので、どうしても隙間を無くしたい人は使えるかもしれない。

[https://developer.mozilla.org/ja/docs/Web/HTML/Element/div:embed:cite]


(クリックで展開)

iris %>% 
    dplyr::group_by(species) %>% 
    dplyr::summarize(mean)


 使いこなすと報告書の纏めがだいぶ楽になるはず。
 HTMLで作成して提出できる環境なら便利だと思うので、HTMLでできる機能については今後も少しずつ覚えていくとRMarkdownが豊かになりそう。


Enjoy!