読者です 読者をやめる 読者になる 読者になる

ふんわり R-tips

ぜんぜんわからない、俺たちは雰囲気でRをやっている

Shinyアプリケーションを単一ファイルapp.Rから実行する方法

Shiny

Shinyアプリケーションを一つのファイルから実行する方法を説明します。

Shinyのバージョン0.10.2から、server.Rとui.Rの2つのファイルからビルドすることなく、app.RファイルひとつだけでShinyアプリケーションが実行可能になっています。

新たにディレクトリを作成し、そのディレクトリ下にapp.Rファイルを作成します。runApp("ディレクトリ名")を実行すると、app.Rに記述されたShinyアプリケーションが実行されます。サンプルアプリケーション01_helloを編集して、server.Rとui.Rからapp.Rを作成して、実行する例を示します。

01_helloは入力用のスライドバーと出力用のヒストグラムが配置されたShinyのサンプルアプリケーションです。

r-tips.hatenablog.com

server.R

library(shiny)

function(input, output) {
  output$distPlot <- renderPlot({
    x    <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
}

Code license:MIT

ui.R

library(shiny)

fluidPage(
  titlePanel("Hello Shiny!"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

Code license:MIT

server.Rとui.Rから作成したapp.R

app.Rでは以下の例に示すように、UIオブジェクトとserver関数を引数としてshinyApp()を呼び出します。

library(shiny)

# server関数functionの返す値を変数へ
server <- function(input, output) {
  output$distPlot <- renderPlot({
    x    <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
}

# uiオブジェクトfluidPage()を変数へ
ui <- fluidPage(
  titlePanel("Hello Shiny!"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

# uiオブジェクトとserver関数を引数として、shiniApp()実行
shinyApp(ui = ui, server = server)

Code license:MIT

runApp()とapp.Rなしで、Shinyアプリケーションを実行

shinyApp()関数は、shiny.appobjクラスのオブジェクトを返します。このオブジェクトがコンソールに返されたときに、print.shiny.appobj()関数によりアプリケーションが出力されます。print.shiny.appobj()が、オブジェクトからShinyアプリケーションを実行する関数です。

同様の方法で、app.Rという名前のファイルでなく、そのファイルをディレクトリ下に置いていなくても、アプリケーションを実行できます。例えば、test.Rというファイルを作成して、そのファイル内でshinyApp()関数呼び出しを最後に記述し、以下のコードをコンソール上から実行すれば、Shinyアプリケーションが実行されます。

print(source("test.R"))

source()関数が実行されると、shiny.appobj-butが返されます。source()だけでは、まだ出力はされません。print()関数でラップすることにより、Shinyアプリケーションが実行されます。

この方法はお手軽ですが、ディレクトリ下にapp.Rをおいて実行する方法に比べると、いくつかのアドバンテージがなくなります。runApp()関数を実行するとき、Shinyはファイルをモニターしており、ブラウザをリロードするとファイルをリロードします。開発時に、shinyアプリケーションを実行したまま、ファイルを編集するときには、こちらの方が便利です。