Shinyアプリの実装方法
続いて、具体的にShinyアプリの実装方法について紹介します。Shinyアプリの概要をつかんでもらうために2パターンのShinyアプリのサンプルコードを取り上げます。
- iris(アヤメの花)の品種のクラスタリングレポート
- ブログ記事の日本語ワードクラウドレポート
irisの品種のクラスタリングレポート
公式ギャラリーにあるクラスタリングレポートのサンプルコードを眺めながら、Shinyアプリの構成を理解していきましょう。
このサンプルアプリで使われているデータセットはRユーザーにはおなじみのiris(アヤメの花)のデータを使います。irisはRにデフォルトで用意されており、150件のアヤメの花の特徴(花びらなどの幅や長さ)情報と品種名を保持しています。このirisの特徴情報を使ってk-means法(注1)でクラスタリングしてみます。
k-means法:非階層型クラスタリングの手法の一つ。詳しく知りたい方はWikipediaを参照してください。
ここで、クラスタリングレポートをインタラクティブにする動機を考えてみます。インタラクティブにするということは、レポート作成者がすべてのパラメータをあらかじめ確定させる必要がないということです。今回アヤメの花の品種が実際に何種類存在するか分からないという前提でクラスタリングを行います(irisデータに含まれる品種情報を伏せてクラスタリングを行う)。今回用いるk-means法では、分割するクラスタ数はユーザーがパラメータとして与える必要があります。静的なレポートの場合、3品種あるか、4品種あるか分からないので、可能性があるだけ、複数の図をレポートに並べるなどして用意する必要があります。しかし、インタラクティブなレポートではクラスタ数はユーザーがブラウザから、レポートを見ながら調整し、簡単に見比べることができるのです。
さあ、以下のページにアクセスして動作を確認してみてください。
上記では分割するクラスタリング数だけでなく、特徴(X軸、Y軸)に何を選ぶかをパラメータとして渡すことができます。
ちなみに、こちらのRのソースコードはサンプルアプリページ右上の「GET CODE」のリンク先から完全な形で参照することができます。サンプルプロジェクトのトップページからダウンロードもしくはgit clone
しておくとよいでしょう。ダウンロードしたserver.R
がある場所でRを起動し、library(shiny)
、runApp()
の順に実行すれば、あなたのPCでも同じサンプルアプリが動作します。
サンプルコードの解説
サンプルコードをui.R
から見ていきましょう。
ui.R
# 基本レイアウト(pageWithSidebar)でUIを定義 shinyUI(pageWithSidebar( # ①Header Panel(Shinyアプリタイトル) headerPanel('Iris k-means clustering'), # ②Sidebar Panel(入力エリア) # ここでは3つのパラメータをそれぞれxcol(x軸の説明変数), ycol(y軸の説明変数), clusters(クラスタ分割数)としてserver.Rへ渡している sidebarPanel( selectInput('xcol', 'X Variable', names(iris)), selectInput('ycol', 'Y Variable', names(iris), selected=names(iris)[[2]]), numericInput('clusters', 'Cluster count', 3, min = 1, max = 9) ), # ③Main Panel(出力エリア) # 入力結果をRで処理した結果plot1(クラスタリング結果のグラフ)を受け取り表示させている mainPanel( plotOutput('plot1') ) ))
まずはレイアウトを確認してみます。
ui.R
中の①Header Panel、②Sidebar Panel、③Main Panelはそれぞれ以下の図のように対応しています。
入出力については、②Sidebar Panelで以下の3つのパラメータを入力変数として定義しています。
- xcol: X軸の説明変数
- ycol: Y軸の説明変数
- clusters: クラスタ分割数
さらに、③Main Panelで以下の変数で実行結果を受け取って表示できるように出力変数を定義しています。
- plot1: クラスタリング結果図
server.R
続いてserver.R
も見ていきます。
server.R
の動きはui.R
で入力変数として定義していた変数に対して、input$(変数名)をという変数名で受け取り、何らかRでの処理を行い、その結果を同じく出力変数として定義していた変数に対して、output$(変数名)という変数名でui.R
へ戻すという流れになります。
shinyServer(function(input, output, session) { # irisデータの全ての列の中から、入力画面でx軸(xcol)とy軸(ycol)として選んだ列だけに絞ったデータをselectDataとして定義する selectedData <- reactive({ iris[, c(input$xcol, input$ycol)] }) # 入力画面から選んだ列のみにしたselectDataに対して、クラスタ分割数(clusters)として入力された数をパラメータとしてk-meansクラスタリングを実施 clusters <- reactive({ kmeans(selectedData(), input$clusters) }) # クラスタリング結果のグラフをイメージとして作成 output$plot1 <- renderPlot({ par(mar = c(5.1, 4.1, 0, 1)) # クラスタリング結果をプロット plot(selectedData(), col = clusters()$cluster, pch = 20, cex = 3) points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) })
メイン処理であるクラスタリングは、server.R
の中のkmeans()関数で行っています。この関数の引数をui.R
からパラメータとして受け取り、結果をui.R
へ渡すことでインタラクティブなレポートを実現しているということになります。