R shiny でデータの基礎分析用アプリの作成③

# はじめに
[R shiny でデータの基礎分析用アプリの作成①](https://qiita.com/ryamamoto0406/items/ece1a064f85e7c0466aa)
[R shiny でデータの基礎分析用アプリの作成②](https://qiita.com/ryamamoto0406/items/ef72ed9b0fdbbbda929d)
の続き。統計量の表示ができたので、可視化の部分を書いていく。

# プロットの作成
プロットの出力は`renderPlot`でできるが軸をファイルから読み取った値にするのに一工夫必要になる。server側に`renderUI`を使ってUIを定義して、ui側に`htmlOutput`で書き加えれば、インタラクティブなプロットが作成できる。前回の記事より細かい変更もした（インデントなど）。
変更点にコメントを加えていく。

```R:app.R
# Load packages ----
library(shiny)
library(DT)
library(ggplot2) #プロットのためにパッケージを導入

# Source helpers ----
source("helpers.R")

# User interface ----
ui <- fluidPage(
  titlePanel("Basic analysis"),
  
  sidebarLayout(
    sidebarPanel(
      fileInput(
        "file",
        label = "File input",
        accept = c("text/csv"),
        multiple = FALSE,
        width = "80%")
    ),
    
    mainPanel(
      tabsetPanel(
        type = "tabs",
        tabPanel("Data", dataTableOutput("outFile")),
        tabPanel("Statistic", dataTableOutput("outStat")),
        tabPanel("Correlation", dataTableOutput("outCor")),
        tabPanel(
          "Histogram", plotOutput("hist"), #ヒストグラムの表示
          fluidRow(
            column(3, htmlOutput("Hist.Bins")),
            column(4, htmlOutput("Hist.X")),
            column(4, htmlOutput("Hist.Fill"))
            )
          ),
        tabPanel(
          "Scatter", plotOutput("scat"), #散布図の表示
          fluidRow(
            column(4, htmlOutput("Scat.X"), htmlOutput("Scat.Y")),
            column(4, htmlOutput("Scat.Col"), htmlOutput("Scat.Sha"))
            )
          ),
        tabPanel(
          "Bar", plotOutput("bar"), #度数分布の表示
          fluidRow(
            column(4, htmlOutput("Bar.X")),
            column(4, htmlOutput("Bar.Fil"))
            )
          )
        )
      )
    )
  )

# Server logic
server <- function(input, output) {
  
  inFile <- reactive({
    tmp <- input$file
    if (is.null(tmp)){
      return(NULL)
    } else {
      df <- read.csv(tmp$datapath, header=TRUE)
      return(df)
    }
  })
  
  stat <- reactive({
    tmp <- inFile()
    if (is.null(tmp)) {
      return(NULL)
    } else {
      res <- ana_stat(tmp)
      return(res)
    }
  })
  
  r <- reactive({
    tmp <- inFile()
    if (is.null(tmp)) {
      return(NULL)
    } else {
      res <- ana_cor(tmp)
      return(res)
    }
  })

  output$outFile <- DT::renderDataTable({
    inFile()
  }, extensions = c('Buttons'), options = list(dom = 'Blfrtip', buttons = c('csv', 'excel', 'pdf'))
  )
  
  output$outStat <- DT::renderDataTable({
    stat()
  }, extensions = c('Buttons'), options = list(dom = 'Blfrtip', buttons = c('csv', 'excel', 'pdf'))
  )
  
  output$outCor <- DT::renderDataTable({
    r()
  }, extensions = c('Buttons'), options = list(dom = 'Blfrtip', buttons = c('csv', 'excel', 'pdf'))
  )
  
  #以下ヒストグラムの描画部分
  output$Hist.Bins <- renderUI({
    sliderInput('hist.bins', 'bins', min=1, max=(round(nrow(inFile())/10)), value=(round(nrow(inFile())/20)))
  })
  
  output$Hist.X <- renderUI({
    selectInput('hist.x', 'x', names(inFile()))
  })
  
  output$Hist.Fill <- renderUI({
    selectInput('hist.fill', 'fill', c(None='None', names(inFile())))
  })
  
  output$hist <- renderPlot({
    g <- ggplot(inFile(), aes_string(x = input$hist.x)) + geom_histogram(bins = input$hist.bins)
    if (input$hist.fill != 'None') {
      g <- g + aes_string(fill = input$hist.fill)
    }
    print(g)
  })
  
  # 以下散布図の描画部分
  output$Scat.X <- renderUI({
    selectInput('scat.x', 'x', names(inFile()))
  })
  
  output$Scat.Y <- renderUI({
    selectInput('scat.y', 'y', names(inFile()))
  })
  
  output$Scat.Col <- renderUI({
    selectInput('scat.col', 'color', c(None='None', names(inFile())))
  })
  
  output$Scat.Sha <- renderUI({
    selectInput('scat.sha', 'shape', c(None='None', names(inFile())))
  })
  
  output$scat <- renderPlot({
    g <- ggplot(inFile(), aes_string(x = input$scat.x, y = input$scat.y)) + geom_point()
    if (input$scat.col != 'None') {
      g <- g + aes_string(color = input$scat.col)
    }
    if (input$scat.sha != 'None') {
      g <- g + aes_string(shape = input$scat.sha)
    }
    print(g)
  })
  
  # 以下、度数分布の描画部分
  output$Bar.X <- renderUI({
    selectInput('bar.x', 'x', names(inFile()))
  })
  
  output$Bar.Fil <- renderUI({
    selectInput('bar.fil', 'fill', c(None='None', names(inFile())))
  })

  output$bar <- renderPlot({
    g <- ggplot(inFile(), aes_string(x = input$bar.x)) + geom_bar()
    if (input$bar.fil != 'None') {
      g <- g + aes_string(fill = input$bar.fil)
    }
    print(g)
  })
  
}

# Run the app
shinyApp(ui, server)
```
![analysis_app_4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/92f9f363-867d-2411-e17d-3d8824c46f0b.gif)


# おわりに
以上で基礎分析用アプリケーションの作成は終了とし、今度は dashboard 風の可視化アプリケーションを作成してみたいと思う。