4.4 サンプルアプリにカスタマイズを加える

ここでは、サンプルアプリを改造して、自分の好きなようにカスタマイズしてみよう。 これまでの流れから、shinyのアプリが本質的にはui.Rserver.Rという二つのスクリプトファイルに書いてある内容によって定義されていることが掴めただろう。

4.4.1 ui.R

ui.Rというスクリプトは、ユーザーインターフェースつまりアプリの見た目を定義するスクリプトである。 今回の例を見てみよう。

fluidPage()という関数で、Shinyアプリの見た目を定義している。この関数の引数として、titlePanel()sidebarLayout()mainPanel()sliderInput()という関数が呼び出されている。 これらの関数はそれぞれ、アプリのタイトル、サイドバー、メインパネルを定義している。

例えば、titlePanel()の引数には"Hello Shiny!"という文字列が渡されている。ここを変更してみよう。 "Hello Shiny!""Hello Shiny! I'm a Shiny App!"に変更して再度Run Appを押してアプリを実行すると、タイトルが変更されていることが確認できるだろう。

次にsliderInput()を変更してみよう。sliderInput()はスライダーバーを定義する関数である。 inputIdという引数に与えられる文字列は、server.Rで定義されているinput$の後に続く文字列として利用される。 今回は個々を変更しないが、もし変更する場合はserver.Rinput$の後に続く文字列も変更する必要があることに注意しよう。 さて、残りの引数としては、labelminmaxvalueがある。これらはそれぞれ

  • label: スライダーバーの表示ラベル
  • min: スライダーバーの最小値
  • max: スライダーバーの最大値
  • value: スライダーバーの初期値

と対応している。maxを100にして、valueを20にしてReload Appをしてみよう。 このときスクリプトを保存していないと、変更が反映されないことに注意しよう。

次にmainPanel()内のplotOutput()を見てみよう。ここではoutputId="distPlot"という引数が与えられている。 これはserver.Rで実行されたプロットを受け取るためのものであるのでここだけを変更するとアプリが動かなくなるので変更はしない。

4.4.2 server.R

server.Rではui.Rに応じて、アプリの挙動を定義する。今回の例を見てみよう。 serverというinput, outputを引数にとる関数を定義している。 inputui.Rで定義された変数が格納されており、それぞれinput$inputIdという形でアクセスできる。 一方outputui.Rで定義された変数に対応する出力を定義するための変数である。server側でoutput$outputIdに値を代入すると、ui側で定義されたoutputIdに対応する出力が更新される。

この例では、output$distPlotrenderPlot()という関数を用いてプロットを代入している。 renderPlot()ui側で定義されたoutputIdに対応する出力を定義するための関数である。

renderPlot()の中身を詳しく見ていこう。

  output$distPlot <- renderPlot({
    
    x    <- faithful$waiting
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    hist(x, breaks = bins, col = "#75AADB", border = "white",
         xlab = "Waiting time to next eruption (in mins)",
         main = "Histogram of waiting times")
    
  })

{}で囲まれた部分のスクリプトの最後にhist()でヒストグラムをプロットしており、これがoutput$distPlotに代入されることになる。 それより上のコードはヒストグラムを作成するための準備のためのコードである。 xにはfaithful$waitingが代入されているが、これはfaithfulというデータフレームのwaitingという列を抽出している。 このxに別のデータを代入すると、ヒストグラムの表示が変わる。例えば、

x <- iris$Sepal.Length

などとしてみよう。

また、binsにはseq()という関数を用いて、min(x)からmax(x)までの数値をinput$bins + 1個生成している。これがヒストグラムのビンの数に対応している。 hist()関数については以前説明したので割愛する。xlab, mainといった引数に与えられている文字列を変更すれば、ヒストグラムのラベルやタイトルを変更できる。