R MarkdownでShinyを利用する

これは[R Shiny Advent Calendar 2017](https://qiita.com/advent-calendar/2017/shiny)の11日目の記事です。

# はじめに

Shinyというと「Rを用いたWebアプリケーション」というイメージが強く、事実それを目的として様々なプロダクトが作られています。でもそれが故に「Shiny使ってみたいけど敷居高い…」と感じてしまうのもあるかと思います。

そこで今回は、みなさん慣れ親しんでいるR MarkdownでShinyを利用する方法を簡単に紹介します。

# R Markdown with Shiny

## R MarkdownにShinyを埋め込むメリット

さて、R MarkdownでShinyを利用するとどういうメリットがあるのでしょう。

なによりも「インタラクティブな要素をR Markdownのhtml出力に埋め込むことができる」という点です。R Markdownで生成したhtmlドキュメントは、htmlwidgets系の出力を利用しない限り静的で、インタラクティブに扱うことができません。すなわち「生成後はRコードを修正・再評価できない」のです。しかしここでShinyが動くというのであれば、適切なインプットフォームを設定することで様々なことができるようになります。

また、「RmdスライドでShinyを動かせる」ことも挙げられます。R Markdownでhtmlスライドを生成することができるのですが、ここにShinyを埋め込むことにより「インタラクティブなプレゼンテーションを実行できる」ようになりまう。これはもうインパクト大ですね。

また、通常のShinyで作るよりも若干敷居が下がるのもメリットだと思います。というわけで実践してみましょう。

## Rmdファイルを生成

RStudioの画面左上から、新規でR Markdownファイルを生成します。この時、新規作成ダイアログボックスで**「Shiny」**を選択してください: 

![select_shiny.PNG](https://qiita-image-store.s3.amazonaws.com/0/35118/eb7a674f-97be-bfec-96c9-057ed5779748.png)

「Shiny Document」は、要するに通常のhtml_documentにShinyが埋め込めるようになっている形式です。そして「Shiny Presentation」は、要するに通常のioslides_presentationにShinyが埋め込めるようになってる形式です。いずれかを選択し、「OK」をクリックしてください。これでサンプルファイルが生成されます。

## Shiny Document

生成されたサンプルを、そのまま実行してみましょう。いつものRmdファイルであるならば「Knit」ボタンなのですが、今回は「Run Document」となっています。というわけで実行すると、以下のようになります:

![render_shiny.PNG](https://qiita-image-store.s3.amazonaws.com/0/35118/84fc537c-faeb-37aa-d062-17d377ebf3d5.png)

このように、いつものRmdにインタラクティブなコンテンツを差し込めました！すごいですね。

### Shinyの埋め込み方

基本的に、ひとつのチャンクにinputとoutputの両方を準備すればOKです。このあたりは本家のドキュメントを一読してもらえればすぐにイメージができるでしょう:

[Interactive Documents](http://rmarkdown.rstudio.com/authoring_shiny.html)

Inputまわりについては、通常のShinyのInputまわりの関数が同じように使えますので、そちらを参照してもらうといいかと思います。また、すでに他のディレクトリでShiny Appsを作っている場合、そのディレクトリを参照して呼び出すことができます。これについては上記サンプルの２つめの例になるので、そちらを参照してみてください。

## Shiny Presentation

それではShiny Presentationを新規で生成して、そのまま実行してみましょう。いつものRmdであれば「Knit」ボタンなのですが、今回は「Run Preseentation」となっています。というわけで実行すると、以下のようになります:

![render_shiny_ioslides.PNG](https://qiita-image-store.s3.amazonaws.com/0/35118/363de542-4da6-815b-44a1-726f8c5dfea5.png)

このように、いつものRmdスライドにインタラクティブなコンテンツを差し込めました！グリグリ動かせるのできっと注目を集めることでしょう。なお、Shinyの埋め込み方についてはShiny Documentと同じなので省略します。

# 補足

## 要するに`runtime: shiny`をつければいい

普段からR Markdownを使っている方ならば、ファイル冒頭のyamlを見て気づいたと思います。R Markdown上でShinyを使いたいのであれば、単に`runtime: shiny`を追加すればOKです。これによりShiny実行モードになります。したがって、「Shiny Document」はhtml_documentにruntimeを追記しただけ、そして「Shiny Presentation」はioslides_presentationにruntimeを追記しただけとなっています。

というわけで、runtimeに対応している出力形式であれば、他のものでもshiny出せます。それらの出力形式が対応しているかどうかは、`?rmarkdown::html_document`とヘルプを表示させて、`runtime`のところを確認してみてください。

## デプロイ(公開)方法

通常のR Markdownは普通のhtmlファイルなので、Web上の適切な場所に配置すればOKでした。ところが`runtime: shiny`を追加したドキュメントは多少事情が変わります。R MarkdownとはいえバックグラウンドでShinyが動いていなければなりません。したがって扱いとしてはShiny Applicationに準じます:

1. Shiny ServerもしくはShinyApps.ioにアップロード  
これが一番確実で早いでしょう。これに関してはすでに同アドベントカレンダーにありますし、日本語でもたくさんの解説記事がありますので省略します。
2. Rmdファイルを配布してRStudioで実行  
必要なパッケージ等が先方にあるのであれば、これでも相手に渡すことができます。例えばGitHubに配布用リポジトリを準備し、先方に`git clone`すれば簡単に届けることができます。実行方法をREADME.mdに記載しておけばさらに親切ですね。ただしこの方法だとRStudio上でしか実行できないので、そこはやむを得ないところでしょう。

他にも方法がないことはないのですが、本記事はあくまで紹介を意図したものなので、この辺にしときます。というわけで、ぜひお試しください。

**Enjoy！**