R言語による電子カルテデータの二次利用

~R言語初心者がデータ処理を楽しめるように基本的内容中心のサイトです~

shinyの使い方

便利なスクリプトを書くと、人に自慢したくなります。
でも、そもそもRを普段使ってない人にRstudioの画面を見せても、なんか難しそうで特別な人しか使えないんでしょ…って言われてしまいそうです。

そんな時はShinyアプリで便利さをアピールしましょう。アプリはクラウドに簡単にアップできるので、ネット環境があれば、Webブラウザーで使ってもらえます。これでRユーザーがまた増えるかもしれません。

shinyは、画面構成を作る ui.Rとデータを処理するserver.Rという2つのプラグラムで構成されます。

ui.R

library(shiny)
shinyUI(fluidPage(
  ## ここにUIスクリプト
  plotOutput("plot_iris")
))

server.R

library(shiny)
shinyServer(function(input, output){
  ## ここにサーバースクリプト
  output$plot_iris <- renderPlot({
    plot(iris)
  })
})

このような2つのスクリプトを作成し、あとはsourceパネル右上のRunAppボタンを押せば実行です。

これらを実行することでshinyアプリが動くのですが、後でクラウドにアップするまでは、実行ファイルが一個の方が楽なので、僕は単一の実行ファイルでテストスクリプトを動かしています。

library(shiny)

ui <- shinyUI(fluidPage(
  ## ここにUIスクリプト
  h3("hello world")
))

server <- shinyServer(function(input, output){
  ## ここにサーバースクリプト
})

## shinyApp関数で実行するだけ。
shinyApp(ui = ui, server = server)

shinyは、テキスト、プロット(基本の作図関数、ggplot2、plotly)、表(DT)、leafletの地図、フローチャート(DiagrammeR)などが表示できるので、表現力も豊かです。サンプルスクリプトはこんな感じです。

library(dplyr)
library(shiny)
library(ggplot2)
library(DiagrammeR)
library(DT)
library(leaflet)

ui <- shinyUI(fluidPage(
  h2(textOutput("text1")),
  h2(verbatimTextOutput("text2")),
  plotOutput('plot'),
  dataTableOutput('table1'),
  grVizOutput('diagram'),
  leafletOutput("map", height = 300)
))

server <- shinyServer(function(input, output){
  output$text1 <- renderText({ 
    text <-c("hello world") 
  })
  output$text2 <- renderPrint({
    text <- c("good \n mornig")
    cat(text, sep="\n")
  })
  output$plot <- renderPlot({
    #iris %>% tail()
    ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species)) + geom_point()
  })
  output$table1 <- renderDataTable(
    iris,
    options = list(pageLength = 5)
    )
  output$map <- renderLeaflet({
    map <- data.frame(address=c("Sapporo"),lat=43.0681678,lon=141.3509345);map
    m = leaflet(map) %>% addProviderTiles("CartoDB.Positron")
    m %>% 
      addMarkers(data = map, lat = ~ lat, lng = ~ lon, popup = map$address) 
  })
  output$diagram <- renderGrViz({
    grViz("
      digraph {
          graph [overlap = true, fontsize = 10]
          node [shape = box,fontname = Helvetica]
          A; B
          node [shape = circle,fixedsize = true,width = 0.9]
          1; 2
          A->1 B->2 1->2
      }
    ")
  })
})

shinyApp(ui = ui, server = server)

表示画面はこうなります。
f:id:r_beginner:20160330185731p:plain

今回は出力するだけでしたが、本当のshinyの凄さは簡単に作れる入力画面と、それにインタラクティブに反応する出力画面なので、時間のあるときに続きを書きます。

ちなみに最近作った、shinyアプリの画面の一部です。電子カルテの横に立ち上げて、eGFRやFIB4indexやHOMA-IR等を計算する電卓代わりに使っています。
f:id:r_beginner:20160330190638p:plain