jnobuyukiのブログ

JavaScriptとR言語を中心に研究活動に役立つwebアプリケーション技術について考えていきます。twitter ID: @j_nobuyuki

Shinyを利用してインタラクティブにデータを解析

R言語は強力な統計ツールの開発がどんどん進んでいます。今回紹介するShinyはR言語をブラウザ上で使用するためのパッケージです。うまく利用すると、実験やシミュレーションの結果をわかりやすく伝えられそうな気がします。

Shinyのインストール

CRANに登録されているパッケージなので、特に必要な知識はありません。install.packages("shiny")とRのセッションで書くだけで利用できます。
ShinyのウエブページShinyでは、チュートリアルがいくつか用意されているので、これから始めるのがいいかもしれません。

Shinyの特徴

Shinyは、基本的にui.Rとserver.Rという二つのファイルを作成します。ui.Rは、ブラウザ上のUIの設定を担当します。server.Rはui.Rで選択したパラメータを利用しながら、データ解析を行い、結果の出力を指示します。ファイル名はui.Rとserver.Rで、同一のフォルダに保存する必要があるので、注意しましょう。

簡単な使用例:データの生成とヒストグラムの作成

では、とても簡単な例を利用して、Shinyを利用した解析のイメージを紹介します。ガウス分布からサンプルを抽出したものをヒストグラム表示してみます。サンプル数を選ぶメニューを作って、いろいろなサンプル数でヒストグラムの見え方がどのように変化するかを調べてみましょう。

ui.Rの設定

ファイルの最初はlibrary(shiny)にします。
次にshinyUI()を作成します。この関数の引数としてページの構成を書き込んでいきます。いろいろな書き方が用意されていますが、今回はbootstrapPage()を利用します。UIは、基本的に入力に関する部分と出力に関する部分を設定します。次に、入力部。サンプル数を選べるように selectInput()関数を使います。この関数の最初の引数inputIdはこの部分のIDを示します。次に、セレクターにつけるラベル、選択肢、最初に選ぶ値をそれぞれlabel, choices, selectedで設定します。

library(shiny)

shinyUI(
    bootstrapPage(
      selectInput(
         inputId = "nSample",
         label = "Number of samples",
         choices = c(20, 40, 60),
         selected = 20
      )

  )

)

次は出力部を設定します。グラフを描きたいので、plotOutputにしましょう。この関数も第1引数はIDです。

plotOutput("output")

server.Rの設定

server.Rもlibrary(shiny)で始めます。次にshinyServer()を設定します。function(input, output){}のinputとoutputはui.Rとの接点になります。今回はuiの"output"というIDの場所にヒストグラムを作ります。ここでちょっとしたコツがあって、renderという考え方を利用します。これは、UIの入力部に何らかの変更があったら、直ちに上書きのための処理を始めます。グラフを上書きするにはrenderPlot()という関数を使います。この引数としてヒストグラムを作成します。

library(shiny)

shinyServer(function(input, output){

   output$output <- renderPlot({
      hist(rnorm(input$nSample))
   })
})

まとめ

今回の例の場合、サンプル数の選択肢を変更するとすぐにヒストグラムが上書きされます。今回はガウス分布を使いましたが、他の分布に変えたり、もっとたくさんのサンプルで試したりなど、非常に高い拡張性を持っています。これをうまく利用すると統計学に関する基本的な事柄の説明や実験結果のシミュレーションを効率的にできそうです。