Recapitulare: pornim de la sablon

library(shiny)

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

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

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

Inputs

actionButton()

in inputId se pastreaza numarul de click-uri

… apasam pe buton si afiseaza textul Ati apasat pe buton de x ori

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  actionButton(inputId = 'buton', label='Apasa aici :)'),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText(
    {
      sprintf('Ati apasat pe buton de %d ori!',input$buton)
    }
  )
}

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

checkBoxInput()

in inputId se pastreaza (boolean) daca box-ul e bifat sau nu

… sa afiseze bifat daca un checkBox e bifat si bifati va rog daca nu e bifat…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  checkboxInput(inputId = 'bifat', value=FALSE, label="incercati sa bifati"),
  textOutput('text')
  
)

# server
server <- function(input, output) {
  output$text <- renderText({
    if (input$bifat) {
      print("bifat")
    }
    else {
      print("bifati, va rog")
    }
  })
}

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

checkboxGroupInput()

inputId e o lista cu box-urile alese

… bifeaza valori intr-o lista si afiseaza ce a ales…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  checkboxGroupInput(inputId='group', label='grup de checkBox',
                     choices=c('prima', 'a doua', 'a treia'), selected=c('prima','a doua')),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
   print(input$group)
  })
}

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

iar pentru a accesa o anumita valoare:

server <- function(input, output) {
  output$text <- renderText({
    text <- ''
    if ('prima' %in% input$group){
      text <- c(text, 'Primul e bifat. ')
    }
    if ('a doua' %in% input$group){
      text <- c(text, 'Al doilea e bifat. ')
    }
    if ('a treia' %in% input$group){
      text <- c(text, 'Al treilea e bifat.')
    }
    sprintf(text)
      })
}

sau pentru a folosi nume pentru lista:

# interfata utilizator 
ui <- fluidPage(
  checkboxGroupInput(inputId='group', label='grup de checkBox', 
                     choices=c('prima'='1', 'a doua'='2', 'a treia'='3'), selected=c('1','2')),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
    text <- ''
    if ('1' %in% input$group){
      text <- c(text, 'Primul e bifat. ')
    }
    if ('2' %in% input$group){
      text <- c(text, 'Al doilea e bifat. ')
    }
    if ('3' %in% input$group){
      text <- c(text, 'Al treilea e bifat.')
    }
    sprintf(text)
  })
}
  • optiunea inline le aseaza orizontal…

dateInput()

inputId pastreaza data aleasa in format data: numar intreg de zile de la 1.01.1970. Pentru a afisa data in format obisnuit se foloseste functia format()

… citeste o data si o afiseaza…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  dateInput(inputId='data', label='Alegeti o data:',startview = 'May', language='en'),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
    format(input$data,format="%B %d %Y")
  })
}

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

dateRangeInput()

inputId e o lista de doua elemente cu cele doua date

… cititi un interval calendaristic si afisati numarul de zile dintre cele doua date…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  dateRangeInput(inputId = 'dateRange', label='Alegeti un interval',
                 language='en', separator='pana la '),
  textOutput('data1'),
  textOutput('data2'),
  textOutput('numar')
)

# server
server <- function(input, output) {
  output$data1 <- renderText({
    format(input$dateRange[1],'%d.%m.%Y')
  })
  output$data2 <- renderText({
    format(input$dateRange[2],'%d.%m.%Y')
  })
  output$numar <- renderText({
    sprintf('Atatea zile: %d.',input$dateRange[2]- input$dateRange[1])
  })
}

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

fileInput()

inputId este de tip fisier, lista care contine ‘name’, ‘size’, ‘type’ si ‘datapath’. ‘datapath’ se refera la calea fisierului si se foloseste pentru a accesa fisierul in continuare (de ex. pt a importa continutul sau)

… cititi un fisier si afisati numele lui…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  fileInput(inputId='fisier', label='alegeti un fisier', multiple=FALSE),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
    input$fisier$name
  })
}

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

… cititi un fisier.csv, il importati in R si afisati tabelul corespunzator…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  fileInput(inputId='fisier', label='alegeti un fisier', multiple=FALSE, 
            accept=c(
              "text/csv",
              "text/comma-separated-values,text/plain",
              ".csv")),
  tableOutput('tabel')
)

# server
server <- function(input, output) {
  output$tabel <- renderTable({
    t <- read.csv(input$fisier$datapath, header=TRUE)
    t
  })
}

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

numericInput()

inputId este valoarea aleasa

… citeste un numar si il afiseaza …

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  numericInput(inputId='numar', label='alegeti un numar ', min=4, max=24, step=3, value=4),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
    input$numar
  })
}

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

passwordInput()

inputId pastreaza textul introdus ca si parola

… citeste o parola si o afiseaza…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  passwordInput(inputId= "password", label="Password:"),
  actionButton(inputId="go",label= "Go"),
  verbatimTextOutput("value")
)

# server
server <- function(input, output) {
  output$value <- renderText({
    req(input$go)
    isolate(input$password)
  })
}


# rulare
shinyApp(ui = ui, server = server)
  • foloseste functia req(…) pentru a executa codula din renderText() doar daca valoarea din input$go (din lista lui req()) este valida.

radioButtons()

inputId pastreaza valoarea aleasa

… alege o valoare din 3…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  radioButtons(inputId = 'radio', label='Alegeti valoarea',
               choices=c('unu','doi','trei'), inline=TRUE),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
    input$radio
  })
}

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

sau daca vrem sa verificam o anumita valoare:

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  radioButtons(inputId = 'radio', label='Alegeti valoarea',
               choices=c('unu','doi','trei'), inline=TRUE),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
    if (input$radio=='trei'){
      print('Succes')
    }
    else print("nu e ales trei!")
  })
}

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

selectInput()

inputId pastreaza lista cu cele alese (dupa nume) similar cu checkboxGroupInput()

… alege una sau mai multe valori dintr-o lista predefinita si le afiseaza…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  selectInput(inputId='lista', label='alegeti una sau mai multe valori din lista',
              choices=c('prima','a doua', 'a treia'), multiple=TRUE),
  textOutput('text')
)

# server
server <- function(input, output) {
  output$text <- renderText({
    input$lista
  })
  
}

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

sliderInput()

inputId returneaza numarul ales

… citeste un numar si il afiseaza…

library(shiny)

ui <- fluidPage(
  sliderInput(inputId='numar', label='alegeti un numar din nou', value=0,
              min=-100, max=100, step=10, animate=TRUE),
  textOutput('text')
)

server <- function(input, output){
  output$text <- renderText({
    input$numar
  })
}

shinyApp(ui, server)

submitButton()

amana TOATE reactiile pana la apasarea lui

… citeste un numar cu numericInput(), altul cu sliderInput() si la apasarea butonului calculeaza suma lor…

library(shiny)

ui <- fluidPage(
  sliderInput(inputId='numar', label='alegeti un numar din nou', value=0,
              min=-100, max=100, step=10),
  numericInput(inputId='numar1', label='alegeti celalalt numar', value=0,
               min=0, max=100, step=10),
  submitButton(text="Acesta e butonul", icon="Refresh"),
  textOutput('text')
)

server <- function(input, output){
  output$text <- renderText({
    input$numar+input$numar1
  })
}

shinyApp(ui, server)

textInput()

inputId returneaza textul introdus

… citeste un text si il afiseaza…

library(shiny)

# interfata utilizator 
ui <- fluidPage(
  textInput(inputId = 'text',label='introduceti un text', value='text'),
  textOutput('textAfisat')
)

# server
server <- function(input, output) {
  output$textAfisat <- renderText({
    input$text
  })
}

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

Exercitii

  1. Plasati pe o pagina web 3 butoane. Afisati la fiecare apasare a unui dintre ele: ati apasat butonul nr. x de n ori

  2. Pe o pagina web oferiti o lista de 5 titluri de carti din care utilizatorul poate sa aleaga oricate. Afisati titlurile alese.

  3. Pe o pagina web alegeti o data intre 2 ianuarie 2017 si 3 februarie 2018. Afisati data in trei formate diferite.

  4. Pe o pagina web selectati un interval intre doua date calendaristice. Afisati un mesaj daca cele doua date nu sunt in ordine cronologica.

  5. De pe o pagina web permiteti incarcarea unui fisier in format .csv; importati-l in R si afisati continutul sau. Permiteti utilizatorului sa aleaga intr-un checkbox daca fisierul are header sau nu.

  1. Pe o pagina web cititi 7 numere si afisati media, abaterea medie patratica si mediana lor.

  2. Pe o pagina web solicitati o parola. Daca utilizatorul introduce ‘shiny’ afisati un mesaj de felicitare. Daca nu, afisati un mesaj care sa il anunte ca parola e gresita.

  3. Pe o pagina web oferiti utilizatorilor sa evalueze un produs alegand dintre excelent, foarte bine, bine, satisfacator, nesatisfacator folosind radioButtons. Afisati alegerea facuta.

  4. Aceeasi cerinta ca si la punctul 9, dar folosind selectInput().

  5. Creati o pagina care “da cu 2 zaruri”: genereaza doua numere aleatoare intregi intre 1 si 6. Cereti utilizatorului sa ‘parieze’ pe suma numerelor introducand o valoare intr-o bara numerica. Daca valoarea introdusa este mai mare decat suma obtinuta aleator, utilizatorul a castigat si primeste un mesaj de felicitare. Daca valoarea e mai mica a pierdut si primeste un mesaj corespunzator. Daca valorile sunt reale se genereaza un nou set de numere. ‘Zarurile’ se arunca doar la apasarea unui buton.