Aplicatii Shiny

Sablon:

library(shiny)

# interfata utilizator 
ui <- fluidPage()

# server
server <- function(input, output) {}

# rulare
shinyApp(ui = ui, server = server)
  • in partea de ui vom construi pagina web;
  • in partea de server vom face calcule/grafice R;
library(shiny)

# interfata utilizator 
ui <- fluidPage('Text oarecare')

# server
server <- function(input, output) {}

# rulare
shinyApp(ui = ui, server = server)

Inputs si Outputs

ui <- fluidPage(
   # *Input() ,
   # *Output()
)

Inputs

Exemplu de functie de input:

sliderInput(inputId='numar', label='Alegeti un numar',
            value=25, min=1, max=100)

Daca rulam acest cod in linia de comanda obtinem codul HTML corespunzator:

<div class="form-group shiny-input-container">
  <label class="control-label" for="numar">Alegeti un numar</label>
  <input class="js-range-slider" id="numar" data-min="1" data-max="100" data-from="25" data-step="1" data-grid="true" data-grid-num="9.9" data-grid-snap="false" data-prettify-separator="," data-prettify-enabled="true" data-keyboard="true" data-keyboard-step="1.01010101010101" data-data-type="number"/>
</div>

Dar daca il adaug in fluidPage:

library(shiny)

# Define UI for application 
ui <- fluidPage(
   sliderInput(inputId = 'num', 
               label="Alegeti un numar", 
               value=25, min=1, max=100)
   )

# Define server logic
server <- function(input, output) {}

# Run the application 
shinyApp(ui = ui, server = server)

Obtin… (rulati)

In general functiile de Input (vezi Shiny Cheat Sheet) vor avea argumentele:

  • inputId = folosit pentru identificarea valorii citite
  • label = pentru a indica semnificatia valorii citite
  • alte argumente specifice (de exemplu value, min, max)

  • pentru mai multe informatii: ?sliderInput

Outputs

*Output() specifice (vezi Shiny Cheat Sheet);

Exemplu:

plotOutput('hist')

va reprezenta histograma ‘hist’.

Dar daca adaugam aceasta linie de cod in exemplul de mai sus si rulam

library(shiny)

# Define UI for application 
ui <- fluidPage(
   sliderInput(inputId = 'num', 
               label="Alegeti un numar", 
               value=25, min=1, max=100),
   plotOutput('hist')
   )

# Define server logic
server <- function(input, output) {}

# Run the application 
shinyApp(ui = ui, server = server)

nu se va intampla nimic in plus pentru ca R nu stie cine e ‘hist’.

Recapitulare

  1. Incepem de la sablon (sau de la o aplicatie exsitenta);

  2. Adaugam elemente noi pe pagina ca si argumente ale functiei fluidPage();

  3. Creem elemente reactive pe pagina folosind functii de *Input();

  4. Afisam rezultate cu functii de tip *Output();

  5. Facem legatura dintre ele in partea de server (in continuare)

Server

server <- function(input, output){
   
}

unde input si output sunt liste cu componente pe care le apelam folosind semnul $.

Respectam urmatoarele reguli:

Regula 1

Salvam obiectele de afisat in output$:

output$hist <- #ceva cod care deseneaza o histograma

numele hist din output$hist este acelasi cu cel din

plotOutput('hist')

din ui (mai sus). Cand este referit in ui apare ca si sir de caractere, iar in partea de server ca si element al listei output.

Regula 2

Salvarea in output$ se face folosind functii render() care creeaza output-ul in format potrivit, corelat cu functia Output().

output$hist <- renderPlot(
   {
      #code R care creeaza o histograma
   }
)

Regula 3

Facem legatura dintre valorile introduse in pagina cu functiile de Input() folosind input$ urmat de numele specificat in InputId:

Input$num este acelasi num din InputId='num'

Putem completa codul nostru:

library(shiny)

# Define UI for application 
ui <- fluidPage(
   sliderInput(inputId = 'num', 
               label="Alegeti un numar", 
               value=25, min=1, max=100),
   plotOutput('hist')
   )

# Define server logic
server <- function(input, output) {
   output$hist <- renderPlot(
      {
         hist(rnorm(input$num))
      }
   )
}

# Run the application 
shinyApp(ui = ui, server = server)

Avem acum o aplicatie Shiny completa pe care o putem rula.

Distribuirea aplicatiilor Shiny

shinyapps.io

  • server Shiny gratuit si usor de folosit din Rstudio.

  • creem cont, urmam indicatiile de pe site pentru a conecta calculatorul nostru de contul shinyapps.

  • folosim butonul Publish pentru a incarca aplicatiile pe server

ShinyServer

  • pentru aplicatii mai mari si la nevoie Rstudio ofera posibilitatea instalarii unui server Shiny local

Exercitii

Construiti aplicatii Shiny care sa:

  1. Citeasca un numar de pe un sliderInput si sa afiseze patratul sau.

  2. Sa citeasca doua numere folosind sliderInput si sa il afiseze pe cel mai mare

  3. Citeste un text si afiseaza lungimea sa folosind textul

Lungimea textului este: …

  1. Sa citeasca un text si un numar n si sa afiseze textul de n ori.

Solutie:

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  
  textInput(inputId = 'text',
            label='Introduceti textul :)',
            value=''),
  numericInput(inputId = 'n',
               label='Introduceti numarul n:',
               value=3),
  textOutput('textnOri')
)

# server
server <- function(input, output) {
  output$textnOri <- renderText(
    {
      
        text=''
        for ( i in 1:input$n){
          text <- c(text,'\n', input$text)
        }
        sprintf(text)    
      
    }
  )
  
}

# rulare
shinyApp(ui = ui, server = server)