Np-Urのデータ分析教室

オーブンソースデータなどWeb上から入手できるデータを用いて、RとPython両方使って分析した結果を書いていきます

【R Shiny】基本となるUIのoutput関数を網羅的に理解する!

本記事は、Shiny Advent Calendar 2017の17日目の記事です。


今回はShinyノック第17弾ということで、output関数を一挙に紹介していきたいと思います。
特にShinyを始めたばかりの方に、辞書的に活用して頂ければ幸いでございます。

そもそもShinyって何?という方はこちらの記事を先に読んでみてください。
www.randpy.tokyo

Output関数の紹介

まず、公式チュートリアルを参考に、output関数の一覧をまとめました。                                                                     
ui.Rで使う関数 出力形式 server.Rで使う関数例
dataTableOutput データテーブルrenderDataTabel
htmlOutput HTMLrenderUI
imageOutput 画像renderImage
plotOutput グラフrenderPlot
tableOutput テーブルrenderTable
textOutput テキストrenderText,Print
uiOutput HTMLrenderUI
verbatimTextOutput テキストrenderText,Print

上の表を見て頂ければ、大体何を表示するものかは分かるかと思いますが、いくつか補足しておきます。

  • textOutputとverbatimTextOutputの違いは、後者はエスケープ文字列('\n'で改行など)を認識したテキストアウトプットを出すことが出来ます。
  • tableOutputとdataTableOutputの違いは、後者はUI上でテーブルを操作(昇順、降順、検索...)が出来ます。

※htmlOutputとuiOutputの違いが、調べても分からず、誰か分かる方がいたら教えてください。。。

上の表を元に、UI上で何を表示したいのかによって、関数を使い分けましょう。
この他にも、関数はたくさんありますが、上記で記載したものだけでもアプリを作るには十分です。

それでは、実際にそれぞれの関数のアウトプット画面を見ていきましょう。
なお、今回はソースコードについては一切触れないので、コードの中身が見たい方はGithubを参照してください。
github.com

実践編

まずは完成図がこちらです。
f:id:Np-Ur:20171216194616p:plain

画面上部の各タブによって、表示されるアウトプットが変わります。
なお、用いるデータはirisを使っています。

全ての画面をお見せするのはちょっと冗長なので、今回は先程触れたtableOutputとdataTableoutput、そしてtextOutputとverbatimTextOutputの出力結果の違いをお見せしたいと思います。

tableOutputとdataTableoutput

tableOutputの結果
f:id:gl2000-sans:20171216180019p:plain

dataTableOutputの結果
f:id:gl2000-sans:20171216180111p:plain

テーブルのアウトプット形式を比べると、tableOutputは縦にずらーとデータが並んでいます。
一方dataTableOutputは、10行までしか表示しないような設計になっていたり、またカラムの部分に注目すると昇順・降順ソートができるようになっています。

右上に検索ボックスもありますね。dataTableOutputのほうが見やすさもあり、かつ汎用性がありそうです。

textOutputとverbatimTextOutput

次にテキストの出力結果を見てみましょう。

textOutputの結果
f:id:gl2000-sans:20171216180200p:plain

verbatimTextOutputの結果
f:id:gl2000-sans:20171216180253p:plain

こちらテキストの出力結果ですが、両方の文字列中に、エスケープ文字'\n'を入れています。

verbatimTextOutputの方ではエスケープ文字をしっかりと認識して、改行してることがわかります。またタグ内にテキストが出力されるようになっているのも特徴ですかね。

終わりに

今回は原点に戻って、基本となるアウトプット関数について一通りおさらいをしてみました。

こうやって書き出してみると、まだまだ理解できてないことが多いなと感じました。
今後もうまく使い分けられるよう勉強してかないといけないなと…頑張ります。

是非、皆さんも色々なアウトプット形式を使い分けて面白いアプリを作ってみてください。
それでは良いShinyライフを!!