{bookdown}を利用してRで本を作成

この記事は,[R Advent Calendar 2016](http://qiita.com/advent-calendar/2016/r-rstudio)の第22日目の記事です。

R Markdownとは
--------------

### Rでドキュメント生成

Rは一般にデータ解析や可視化で利用されることが多いですが,Rでドキュメントを生成することが可能です。多くの場合,R Markdownを利用して作成され,その便利さ,将来性に注目が集まっています。以降,R Markdownを念頭に話を進めます。

### Rでやるメリット

R(R Markdown)でドキュメントを生成するメリットは数多くありますが,以下のようなものが挙げられます:

-   分析からレポート生成までが完結
    -   WordもExcelも(そしてぱわぽも)いらない
    -   コピペ汚染からの開放
-   再現性の確保
    -   同一の内容をそのまま再現できる
-   再利用、配布が簡単
    -   コードを簡単に再利用可能
    -   テキストデータなので運用が簡単
-   作るのが簡単
    -   ドキュメント部分は基本Markdown

### 基本的な考え方

R Markdownでドキュメントを生成するには,以下のような流れとなります:

1.  R Markdownファイルを準備
2.  中身を記述
3.  レンダリングして出力を確認
4.  2と3を繰り返す
5.  完成

### R Markdownの参考資料

R Markdownのそもそもの使い方について説明していると本題に辿りつけないので,ここでは参考資料を紹介するのみとさせていただきます:

- [R Markdown](http://rmarkdown.rstudio.com/)  
本家のサイト。ここに始まりここに終わります。チュートリアルが最強。
- [R Markdownで楽々レポートづくり](http://gihyo.jp/admin/serial/01/r-markdown)  
日本語でR Markdownがどういうものなのかを解説してあります。
- [R Markdown入門](https://kazutan.github.io/HijiyamaR5/rmd_intro.html#/)  
スライドで要点を簡単にまとめています。

Rで本を作りたい
---------------

### ドキュメントをまとめたい

R Markdownを使うようになって慣れてくると,だいぶドキュメントが溜まってくるようになります。またRのテキストや分析のまとまったドキュメントをR Markdownで作ってみたくなったり,書籍の形式でまとめてみたくなったりします。

R MarkdownではRStudioと連動して,Webサイトをbuildしたりすることも可能ですが,できればepub形式やgitbook,あるいはpdf形式でまとめたいと思うところでしょう。{rmarkdown}パッケージだけではこれを実現することは難しいです…でも,**{bookdown}パッケージならそれが可能となります**。

### bookdownパッケージ

{bookdown}パッケージは,knitrなどの開発で知られるYihuiが中心となって開発した,R Markdownで書籍を作成するためのパッケージです。これは,複数のRmdファイル(とその他諸々)を束ねて一冊の書籍ファイルを出力してくれます。いくつかの特徴を挙げると…

-   gitbook形式, ePub形式, pdf形式
-   本を通じての図表番号割り振り
-   表紙画像もおk
-   citationも対応

など,書籍,特に電子書籍を自作するにあたって最低限必要となる機能は盛り込まれています。なお試しに私の方で作ってみた,**[ggplot2逆引き本](https://kazutan.github.io/ggplot2-gyakubiki-book/)**をみてもらうと伝わるかと思います。

### 基本的な仕組み

要するに,複数のRmdファイルをいい感じにまとめてしまい,それをKnit(チャンクを評価)して,出来上がったmdファイルをPandocで各種出力形式で吐き出す,という感じです:

![unnamed-chunk-1-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/441473e8-b7b4-4fcd-0f23-f6ed9af529cf.png)


このRmdをまとめあげる時のルールや設定,あるいは各種出力形式での設定などを設定ファイルに記述していくことになります。

### 前準備

{bookdown}パッケージで書籍を作るための前準備として,以下のものが必要となってきます。

- bookdownパッケージ(必須)  
`install.packages("bookdown")`でOK
- RStudio(できれば)  
v1.0以上で。
- tex環境  
pdf出力に必須。ただしいつものpdf\_document以上に罠多し。
- ePubビューワ  
ePub出力結果の確認に必要。

作り方
------

### 基本的な構成

以下の要素は基本必要です:

-   `_bookdown.yml`
-   `_output.yml`
-   `*.Rmd`
-   `*.Rmd` ...

#### `_bookdown.yml`

書籍全体に関する設定を記述します:

    book_filename: "R usui book"  # 書籍名(ファイル名になる)
    chapter_name: "ch: "          # この場合 ch: 1 と自動で振られる
    output_dir: "docs"            # 出力先の指定(デフォは"_book")
    rmd_files:                    # 使用するRmdファイルを指定
      - kosaki.Rmd                  # この順番に束ねます
      - Rmds/sweet.Rmd              # デフォではファイル名昇順

その他は[本家ドキュメント](https://bookdown.org/yihui/bookdown)の[4.4](https://bookdown.org/yihui/bookdown/configuration.html)とかを参照。

#### `_output.yml`

output設定を記述します:

    bookdown::epub_book: default
    bookdown::gitbook:
      css: style.css
      split_by: "rmd"
      config:
        toc:
          before: |
            <li><a href="./">book title.</a></li>
          after: |
            <li><a href="https://github.com/rstudio/bookdown" target="blank">Published with bookdown</a></li>
    bookdown::pdf_book:
      keep_tex: yes

その他は[本家ドキュメント](https://bookdown.org/yihui/bookdown)の[3](https://bookdown.org/yihui/bookdown/output-formats.html)とかを参照。

#### `.Rmd`ファイル

通常通り作成してください。ただ,いつもの冒頭のyamlは設置しないようにしてください。これは無視されます。

ですが,扉(入り口)となるようなファイル(`index.Rmd`など)を準備し,そこに冒頭yamlで設定をきっちり記述するのはOKです。詳しくは,さきほど紹介した[ggplot2逆引き本のGitHubリポジトリ](https://github.com/kazutan/ggplot2-gyakubiki-book)内にある`index.Rmd`を参照してもらえればと思います。

### レンダリング

RStudioを利用しているならば,Buildパネルから,**Build
Book**をクリックし,出力したい形式を選択すればOKです。

もし,yamlヘッダーを(ちゃんと)作りこんだRmdファイル(ここでは`index.Rmd`とします)があるなら,以下のような感じでレンダリングを実行できます:

-   gitbook形式:

        bookdown::render_book("index.Rmd", output_format = "bookdown::gitbook")

-   epub形式:

        bookdown::render_book("index.Rmd", output_format = "bookdown::epub_book")

-   pdf形式:

        bookdown::render_book("index.Rmd", output_format = "bookdown::pdf_book")

生成物を確認してみて,うまくいっているか確認してみましょう。

注意点
------

### 文字コード

bookdownがサポートしているのは**UTF-8**のみです:

> All R Markdown files must be encoded in UTF-8, especially when they
> contain multi-byte characters such as Chinese, Japanese, and Korean.
>
> --- [Yihui Xie](https://bookdown.org/yihui/bookdown/usage.html)

注意してください。

### 日本語見出しについて

{bookdown}は日本語にもちろん対応しています。ただし,**R Markdownいつもの日本語見出し問題は健在**です。これについては,以下の記事を参照してください:

[第4回　レポつく自由自在 ～R Markdownにまつわるエトセトラ～：R Markdownで楽々レポートづくり｜gihyo.jp 技術評論社](http://gihyo.jp/admin/serial/01/r-markdown/0004)

ここにあるpandoc\_argsの設定は,`_output.yml`に記述してください。よくわからない場合は聞いてください。

### pdf & ggplot2 & 日本語の罠

pdf出力するにはTex環境が必要で,これまでのRmdと同様のことがすべて当てはまります。さらに,bookdownでダルトラブルとしては,**pdf\_book出力形式でggplot2で作成した図に日本語を使用すると文字化け(もしくはエラー)**が出てくるというのがあります。

pdf\_book(正確にはpdf\_document)の場合，Rチャンクの出力は`dev=pdf()`がデフォルトに設定してあり,これが日本語を含むggplot2出力でひっかかってしまうためです。

これについて,回避策(暫定的)なものとしては…

-   `dev=png()`に変更させる
    -   画質調整しないとpdfで汚くなる
-   `dev=cairo_pfd()`の利用
    -   でも全体に設定するとhtmlやepubでコケる
    -   トリックはあるけど…(検証中)

他にもいくつかあるんですが,あまり検証する余裕がないので見送ってます。どうしても必要なんじゃあという方がいましたらご連絡ください。

### Merge-KnitかKnit-Mergeか

この記事の前の方で,「Rmdファイルをまとめて(Merge)してからKnitする」と説明しましたが,以下のような流れでも処理させることは可能です:

![unnamed-chunk-2-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/eececd25-018e-e2a0-221d-74c143f585fb.png)


このように処理させたい場合は,`_bookdown.yml`に`new_session: true`と追記してください。これら処理フローの違いについては,詳しくは[本家ドキュメント](https://bookdown.org/yihui/bookdown)の[1.4](https://bookdown.org/yihui/bookdown/new-session.html)を参照してください。

さいごに
--------

### bookdownの参考資料など

実際作るとなると,いろいろわからないことがあるかと思います。この記事だけでは不十分なので,以下を参考にしてみてください:

-   まずは[本家ドキュメント](https://bookdown.org/yihui/bookdown/)を読んでね
-   日本語向けに調整した，最小構成のリポジトリをGitHubに作ってました
    -   [kazutan/bookdown\_ja\_template](https://github.com/kazutan/bookdown_ja_template)
-   いろいろ設定しましたが，以下のリポジトリも参考になるかと
    -   [kazutan/ggplot2-gyakubiki-book](https://github.com/kazutan/ggplot2-gyakubiki-book/)
-   本家が準備しているデモ用リポジトリも
    -   [rstudio/bookdown-demo](https://github.com/rstudio/bookdown-demo)
-   r-wakalangの\#rmarkdown，`@kazutan`，\#おねがいぞうさん

**Enjoy!**