Shiny

install.packages('shiny', repos = "http://cran.us.r-project.org")
library(shiny)

Exemplu 1: aplicatie care construieste o histograma cu numar de intervale care se poate schimba:

runExample("01_hello")

Structura unei aplicatii Shiny

  • un script utilizator (ui.R)
    • controleaza modul de afisare/forma aplicatiei
  • un script server
    • construieste interfata/acitiunile aplicatiei

## de exemplu: -ui.R

library(shiny)

# Defineste interfata utiliator (ui) pentru programul de desenare a histogramei 
shinyUI(fluidPage(

  # Titlul aplicatie
  titlePanel("Hello Shiny!"),

  # Bara la stanga de unde se poate seta numarul de intervale
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),

    # Deseneaza
    mainPanel(
      plotOutput("distPlot")
    )
  )
))

si server.R

library(shiny)

# Defineste serverul logic pentru desenarea histogramei
shinyServer(function(input, output) {

  
  
  # Expresia care genereaza histograma. Expresia este inclusa intr-un apel 
  # catre functia renderPlot, apel care indica 
  #
  #   1) codul este interactiv, trebuie re-executa automat cand se schimba partea de input
  # 
  #   2) rezultatul este de tip grafic
  
  

  output$distPlot <- renderPlot({
    x    <- faithful[, 2]  # Old Faithful Geyser data
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    # histograma
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
})

! Pentru a relua sesiunea de lucru R trebuie oprita aplicatia Shiny (ESC sau STOP)

  • cele doua fisiere sunt salvate impreuna intr-un director (sau unul singur care sa le cuprinda pe amandoua)

  • fiecare aplicatie Shiny are nevoie de propriul director

  • rulam o aplicatie Shiny folosind numele directorului in care se afla

runApp('numele directorului')
  • ‘numele directorului’ trebuie sa contina calea completa
    • sau directorul sa se afle in Working Directory al R

Exercitiu:

  1. Creati un director numit shiny1 in directorul vostru de lucru (working directory)

  2. Copiati fisierele ui.R si server.R din aceasta prezentare in acel director (descideti un fisier R nou, copy-paste partea de cod, salvati fisierul cu numele potrivit)

  3. Lanssati aplicatia cu comanda

runApp('shiny1')
  1. Sa facem niste schimbari in aplicatie:

    • schimbam titlul sa fie in limba romana (orice text);

    • sa setam numarul minim de bin la 5;

  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  #min = 1,
                  min=5,
                  max = 50,
                  value = 30)
    ),
    
    # Deseneaza
    mainPanel(
      plotOutput("distPlot")
    )
  )
- schimbam culoarea barelor;
  output$distPlot <- renderPlot({
    x    <- faithful[, 2]  # Old Faithful Geyser data
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    # histograma
    #hist(x, breaks = bins, col = 'darkgray', border = 'white')
    hist(x, breaks = bins, col = 'skyblue', border = 'white')
  })
runApp('shiny1')

ggplot2:

library(shiny)
library(ggplot2)

# Defineste serverul logic pentru desenarea histogramei
shinyServer(function(input, output) {
  
  
  
  # Expresia care genereaza histograma. Expresia este inclusa intr-un apel 
  # catre functia renderPlot, apel care indica 
  #
  #   1) codul este interactiv, trebuie re-executa automat cand se schimba partea de input
  # 
  #   2) rezultatul este de tip grafic
  
  
  
  output$distPlot <- renderPlot({
    x    <- faithful[, 2]  # Old Faithful Geyser data
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    # histograma
    #hist(x, breaks = bins, col = 'darkgray', border = 'white')
    #hist(x, breaks = bins, col = 'skyblue', border = 'white')
    qplot(x, breaks=bins)
  })
})

Rularea:

Exemple de aplicatii pe care le putem adapta:

system.file("examples", package="shiny")

runExample("01_hello") # histograma
runExample("02_text") # tabele si data.frames
runExample("03_reactivity") # formular interactiv
runExample("04_mpg") # variabile globale (in cod); boxplots
runExample("05_sliders") # bare 
runExample("06_tabsets") # tab-uri
runExample("07_widgets") # help si buton de trimitere 
runExample("08_html") # Shiny app din HTML
runExample("09_upload") # file upload wizard
runExample("10_download") # file download wizard
runExample("11_timer") # an automated timer

Exercitiu:

  1. Salvati local fisierele ui.R si server.R penru aplicatia 02_text

  2. Schimbati textul in limba romana pentru partea de afisare din stanga

    sidebarPanel(
      selectInput("dataset", "Alegeti un tabel:", 
                  choices = c("rock", "pressure", "cars")),
      
      numericInput("obs", "Numar de observatii:", 5)
    )
  1. Modificati numarul de linii care apare implicit in bara de observatii

    • mai sus :)
  2. Modificati codul astfel incat sa afiseze media primei variabile din tabel

  output$summary <- renderPrint({
    dataset <- datasetInput()
    #summary(dataset)
    mean(dataset[,1])
  })
  1. Modificati codul astfel incat sa afiseze ultimele n observatii din tabel in loc de primele
 output$view <- renderTable({
    tail(datasetInput(), n = input$obs)
  })
  1. Modificati codul astfel incat textul din lista de tabele sa apara in limba romana.
    sidebarPanel(
      selectInput("dataset", "Alegeti un tabel:", 
                  choices = c("piatra", "presiune", "masini")),
      
      numericInput("obs", "Numar de observatii:", 5)
    ),

si

  datasetInput <- reactive({
    switch(input$dataset,
           "piatra" = rock,
           "presiune" = pressure,
           "masini" = cars)
  })
  1. (*) Modificati codul astfel incat sa apara inca un tabel cu ultimele n observatii
  # Summary
  output$summary <- renderPrint({
    dataset <- datasetInput()
    summary(dataset)
    #mean(dataset[,1])
  })
  
  # Afiseaza primele n observatii
  output$view <- renderTable({
    head(datasetInput(), n = input$obs)
  })
  
  ## afiseaza ultimele n observatii
  output$viewTail <- renderTable({
    tail(datasetInput(), n = input$obs)
  })
    mainPanel(
      verbatimTextOutput("summary"),
     
      tableOutput("view"),
      
      tableOutput("viewTail")
    )