sabato 23 settembre 2017

My First Shiny App

Da diverso tempo utilizzo RStudio e i suoi prodotti, uno che mi ha sempre incuriosito ma non ho mai utilizzato è Shiny.
Shiny è una libreria che permette di costruire interfacce web utilizzando R, così seguendo un video ho creato la mia prima app in Shiny, visto che sono pochi passi ho pensato di condividere quanto appreso.
Per prima cosa và installato shiny su R e richiamata la libreria.

   install.package("shiny")  
   library (shiny)  

Per prima cosa bisogna salvare lo script nella cartella del progetto (che conterrà tutto ciò che serve all'app, per applicazioni più elaborate) e chiamare il file nomefile-app.R
Gli script shiny hanno una struttura divisa in due blocchi:
  • ui: dove viene indicato ciò che "si vede"
  • server: dove vengono scritte le funzioni
quindi vediamo lo scheletro base dell'app.

 library(shiny)  
 ui <- fluidPage()  
 server <- function(input, output){  
 }  
 shinyApp(ui = ui, server = server)  


Vogliamo costruire un'app che calcoli la funzione rnorm() per un dato input numerico, iniziamo con ui.
Per scegliere l'input vogliamo una barra di scorrimento con valori che vanno da 1 a 100 e impostiamo il valore di default a 25.

 ui <- fluidPage(  
  sliderInput(inputId = "num", label = "scegli un numero", min = 1, max = 100, value = 25),  
 )  

I comandi come sliderInput non bisogna ricordarli a memoria ma ci sono diverse pagine sul sito di RStudio e Shiny dove riporta il codice per molti componenti.
Oltre alla barra cosa vogliamo visualizzare? La distribuzione su un istogramma quindi aggiungiamo a fluidPage:

 ui <- fluidPage(  
  sliderInput(inputId = "num", label = "scegli un numero", min = 1, max = 100, value = 25),  
  plotOutput("hist")  
 )  

Se avviamo l'app da "Run app" ora vedremo una pagina bianca e la barra a scorrimento, questo perchè finchè non completiamo il server non verrà calcolato nulla e quindi niente istogramma.
Nel server vogliamo visualizzare l'istogramma "hist" come definito in ui, che rappresenta rnorm() calcolata su input$num ovvero il "num" assegnato a inputId.

 server <- function(input, output){  
  output$hist <- renderPlot({  
   title <- "100 random normal values"  
   hist(rnorm(input$num), main = title)  
  })  
 }  

Fatto questo possiamo salvare e provare l'app. Io inizialmente per renderla più interattiva ho modificato title con:

 title <- paste0(input$num, " random normal values")  

così da vedere sempre il numero scelto nel titolo dell'istogramma. Il risultato è il seguente.








Partendo da questo potete modificare la vostra app come volete.
Per pubblicarla, se non avete a disposizione un server, potete crearvi un account gratuito (max 5 app) su shinyapps.io, la procedura di registrazione è molto semplice.
La mia prima app potete trovarla qui: nickprock.shinyapps.io/myFirstShinyApp/ 
 

Nessun commento:

Posta un commento