Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第81回 TokyoR 初心者セッション2 はじめてのShiny

Avatar for Kyoko Matsumura Kyoko Matsumura
September 28, 2019

第81回 TokyoR 初心者セッション2 はじめてのShiny

Avatar for Kyoko Matsumura

Kyoko Matsumura

September 28, 2019
Tweet

More Decks by Kyoko Matsumura

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 Twitterなど 都内IT系企業勤務 近況 · @kyyonko アイコンはハイキューの⽉島(ググろう) パンダ本翻訳 - -

    - · 5⽉に転職してはや5ヶ⽉ データサイエンティストと⾒せかけた ただの集計屋 - - · 仕事がぼっちでつらい さすがにからは変わるかな… - - 2/52
  2. 参考⽂献 いきなりですけど参考⽂献です。 公式チュートリアル https://shiny.rstudio.com/tutorial/ 公式チュートリアルの⽇本語訳(by @hoxo_mさん)←ちょっと古め https://qiita.com/hoxo_m/items/c8365117f3444fb51df4 Shiny Tutorial(スッキリしていてわかりやすい) https://bookdown.org/weicheng/shinyTutorial/

    Up-urさんのブログ https://www.randpy.tokyo/entry/shiny_5 Shiny Developer Series(機能⾯でのアップデートを追えたりする) https://shinydevseries.com/ shinydashboard https://rstudio.github.io/shinydashboard/ · 動画もある その他ドキュメントも本当に豊富 http://shiny.rstudio.com/articles/ - - · · · · · 4/52
  3. Shinyとは いいところ 微妙なところ RStudio社が開発した、R⾔語で簡単にWebアプリケーションを作るための フレームワーク · Rだけ知っていればできる (※多少のHTML, CSS, JavaScriptなどの知識があったらよりよい)

    Rで分析した結果を簡易BIとして共有できる パッケージ化されているので、イチから他⾔語のフレームワーク(Ruby on RailsとかDjangoとか) で作らなくていい アプリケーションにしては必要なファイル数が少なめで覚えることが少なくて簡単 · · · · Rでしか作れないので商⽤にするにはちょっと微妙 簡単なだけあって柔軟性はちょっと低いかも? ちょっと重い · · · 7/52
  4. Shinyの構成要素 最⼩限が以下の2つ:uiとserver ui.R server.R ui.Rとserver.Rは2つに分けることもできるが、 中のコードだけまとめてApp.Rというファイルにするこ ともできる。 詳細は後述。 ui =

    user interface(ユーザーインターフェース) 簡単に⾔うと⾒た⽬についての設計を⾏うファイル。HTMLみたいなもの(というか実質HTML) · · ⽂字・図表が出てくる プルダウンやラジオボタンで何かを選べるようにする テキストを⼊⼒したりする - - - uiを実現するために裏で処理を⾏うためのコードを書くファイル · 11/52
  5. Shinyの構成要素 最⼩限じゃないもの 今回は詳細・製作例など割愛するがこんな感じのものがある。 helper.R / global.R その他⾃作関数のファイルなど · ui, server通しての共通の処理を書いたりする

    ui, serverでは動かすたびにコードが実⾏されるが、 ⼀度で済ませたい重い処理(データ読み込 みなど)をここで書いたりする。 - - · Shinyアプリで使いたい⾃作関数は 別でファイルにしておき、Shinyアプリのディレクトリに置 いておいてsourceで呼んだりできる。 - 12/52
  6. App.R ファイル構成: ui.Rとserver.Rの2ファイルに分けなくても、 両⽅の要素を盛り込んだ1つのファイルapp.Rにしても よい。 その場合は末尾にshinyApp(ui = ui, server =

    server)をつける · · library(shiny) ui <- fluidPage( ) server <- function(input, output) { } # shinyApp(ui, server) でも⼤丈夫 shinyApp(ui = ui, server = server) ├── App-1 └── app.R 15/52
  7. HTMLとの対応関係 HTMLを編集する気分で書ける。 fluidPage( h1("Hello Shiny!"), hr(), p(strong("bold font "), em("italic

    font")), p(code("code block")), a(href="http://www.google.com", "link to Google"), HTML('<p> <label>A numeric input:</label><br /> <input type="number" name="n" value="7" min="1" max="30" /> </p>') ) 18/52
  8. HTMLとの対応関係 HTML5対応している。画像を⽤意したら画像⼊れることもできるよ。 p <p> A paragraph of text h1 <h1>

    A first level header h2 <h2> A second level header h3 <h3> A third level header h4 <h4> A fourth level header h5 <h5> A fifth level header h6 <h6> A sixth level header a <a> A hyper link br <br> A line break (e.g. a blank line) div <div> A division of text with a uniform style span <span> An in-line division of text with a uniform style pre <pre> Text ‘as is’ in a fixed width font code <code> A formatted block of code img <img> An image strong <strong> Bold text em <em> Italicized text HTML Directly passes a character string as HTML code 19/52
  9. ui.R server.R titlePanel タイトルパネル。アプリのタイトルを書ける sidebarLayout 下に表⽰させたいものを書ける sidebarPanelかmainPanelだけにするとエ ラーになるので、 sidebarLayoutを使うとき は両⽅書きましょう。

    sidebarLayout fluidPage( titlePanel("title panel"), sidebarLayout( sidebarPanel("sidebar panel"), mainPanel("main panel") ) ) function(input, output) { } sidebarPanel:サイドバーパネル。グレ ーの四⾓に囲まれる mainPanel:メインパネル。⽩い広いスペ ースに表⽰される · · 21/52
  10. Control widgetの例 数字を⼊⼒できるようにした。これにはウィジェットnumericInputを⽤いた。 # ui library(shiny) fluidPage( titlePanel("Hello Shiny!"), sidebarLayout(

    sidebarPanel( numericInput("numInput", "A numeric input:", value = 7, min = 1, max = 30) ), mainPanel( p(strong("bold font "), em("italic font")), p(code("code block")), a(href="http://www.google.com", "link to Google")) ) ) 28/52
  11. Control widgetの例 1つ⽬の引数 "numInput":変数名と思ってください。 2つ⽬の引数 "A numeric input:":ウィジェットの上に表⽰される⽂字 numericInput("numInput", "A

    numeric input:", value = 7, min = 1, max = 30) ⼊⼒した数字がここに格納されるイメージ · # イメージ numInput <- 7 value:デフォルト値 min:今回の⼊⼒ウィジェットで扱える最⼩値 max:今回の⼊⼒ウィジェットで扱える最⼤値 · · · 29/52
  12. とりあえずui library(shiny) fluidPage( titlePanel("円の⾯積を計算します"), sidebarLayout( sidebarPanel( numericInput("numInput", "半径を⼊れてください:", value =

    7, min = 1, max = 30) ), mainPanel( textOutput("txt") ) ) ) sidebarPanelに半径(cm)を⼊れる枠を⽤意する。 mainPanelになにかあるけれども詳細は後述。 · · 33/52
  13. server library(shiny) shinyServer(function(input, output) { output$txt = renderText({ paste0("円の⾯積は: ",

    pi*input$numInput^2) }) }) shinyServer(function(input, output))の部分はおまじない。 output$txt paste0はみんな知ってる⽂字列結合関数です(shiny関係ない) · · セットの名前 output$(固定名)とtxt(⾊々変えられる変数の名前)に別れていると思っててください この変数にrenderText()関数を⼊れることで、{}内の⽂字を出⼒させます。 renderText()関数はinput$numInputの値を受け取って、計算して、その計算結果を⽂字列と して返してくれます。 - - - - · 34/52
  14. ui.R library(shiny) # Define UI for application that draws a

    histogram shinyUI(fluidPage( # Application title titlePanel("Old Faithful Geyser Data"), # Sidebar with a slider input for number of bins sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30) ), # Show a plot of the generated distribution mainPanel( plotOutput("distPlot") ) ) )) 40/52
  15. server.R library(shiny) # Define server logic required to draw a

    histogram shinyServer(function(input, output) { output$distPlot <- renderPlot({ # generate bins based on input$bins from ui.R x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) # draw the histogram with the specified number of bins hist(x, breaks = bins, col = 'darkgray', border = 'white') }) }) 41/52
  16. Webページとして共有する shinyapps.io Shiny Server RStudio Connect 要するにWebサイトにして⾒せる 相⼿にR環境がなくても(Rが使えなくても)OK · ·

    https://www.shinyapps.io/ RStudio社が提供する Shiny アプリ専⽤のホスティングサービス · · https://github.com/rstudio/shiny-server/blob/master/README.md Shinyアプリをホストするために設計されたWebサーバ 無料。オープンソースであり、GitHub上でコードが公開されている Linuxサーバが必要 · · · · https://www.rstudio.com/products/connect/ 新しいサービス。Shinyに限らず⾊々なR製のものをRStudioからパブリッシュできる · · 49/52