1 Qué es Shiny

(Para profundizar contenidos de este curso, o aprender otros aspectos no incluidos, sugerimos tener en cuenta este tutorial de Shiny).

Shiny es un paquete de R que facilita la creación de aplicaciones web interactivas (aplicaciones) directamente desde R. Shiny viene con una variedad de widgets para la construcción rapida de interfaces de usuario web, nosotros escribimos el codigo en R y shiny hará el trabajo pesado de generar el HTML, css, javascript, jquery, etc.

Si aún no has instalado el paquete Shiny, abre una sesión R, conéctate a Internet y ejecuta:

install.packages("shiny")
library("shiny")

2 Estructura de una aplicación Shiny

Las aplicaciones de Shiny deben tener tres componentes:

Es decir: La interfaz de usuario (ui) controla el diseño y la apariencia de su aplicación. La función server contiene las instrucciones que el ordenador necesita para construir la aplicación. Finalmente, la función shinyApp crea objetos de aplicación Shiny a partir de un par de UI/server explícito.

Inicialmente, para aprender, vamos a crear un script “app.R”, que contendrá los tres componentes. Luego, las aplicaciones de Shiny más complejas tienen, al menos, un script para cada componente.

3 Mi primer Shiny app

Primero, haremos nuestra primera Shiny app, y luego explicaremos cómo funciona:

1º Crea un nuevo script.

2º Pega el siguiente código:

library(shiny)

# Define UI for app that draws a histogram ----
ui <- fluidPage(

  # App title ----
  titlePanel("Hello Shiny!"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      # Input: Slider for the number of bins ----
      sliderInput(inputId = "bins",
                  label = "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)

    ),

    # Main panel for displaying outputs ----
    mainPanel(

      # Output: Histogram ----
      plotOutput(outputId = "distPlot")

    )
  )
)

# Define server logic required to draw a histogram ----
server <- function(input, output) {

  # Histogram of the Old Faithful Geyser Data ----
  # with requested number of bins
  # This expression that generates a histogram is wrapped in a call
  # to renderPlot to indicate that:
  #
  # 1. It is "reactive" and therefore should be automatically
  #    re-executed when inputs (input$bins) change
  # 2. Its output type is a plot
  output$distPlot <- renderPlot({

    x    <- faithful$waiting
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    hist(x, breaks = bins, col = "#75AADB", border = "white",
         xlab = "Waiting time to next eruption (in mins)",
         main = "Histogram of waiting times")

    })

}

# Create Shiny app ----
shinyApp(ui = ui, server = server)

3º Selecciona todo el texto y ejecútalo. Deberías ver la aplicación funcionando similar a esto:

4º Prueba la aplicación modificando el sliderInput del Number of bins:. Verás que se modifica el histograma.

5º Si quieres, también puedes hacer click en “Open in Browser” para ver la aplicación como una ventana más de tu browser.


Ahora identifiquemos los tres componentes en el ejemplo anterior:

Es una buena práctica, que cada componente esté en archivos diferentes:

Más adelante, vemos un ejemplo sobre esta buena práctica.

4 Ejecución de una Shiny app

runApp("my_app")

5 Construcción de la interface de usuario (UI)

La UI en Shiny utiliza código HTML. Vamos a usar la función fluidPage para crear una pantalla que se ajusta automáticamente a las dimensiones de la ventana del navegador. Para diseñar la interfaz de usuario de su aplicación, hay que agregar elementos dentro de la función fluidPage.

La función fluidPage contiene layouts y, a su vez, los layouts contienen paneles.

5.1 Layouts

Los layouts se utilizan para organizar los paneles y elementos dentro de un layout existente. A continuación, verás algunos layouts y cómo es su estructura interna:

Ejemplo:

library(shiny)
fluidPage(
  titlePanel("Hello Shiny!"),
  sidebarLayout(
    sidebarPanel(HTML('<p>
         <label>A numeric input:</label><br /> 
         <input type="number" name="n" value="7" min="1" max="30" />
         </p>')),
    mainPanel(
      p(strong("bold font "), em("italic font")),
      p(code("code block")),
      a(href="http://www.google.com", "link to Google"))
  )
)

En el código anterior, puedes identificar:

  • el título del panel (línea 3).
  • el uso de layout sidebarLayout (línea 4) con sus dos partes:
    • sidebarPanel (línea 5).
    • mainPanel (línea 9).

Como se puede observar en el ejemplo, la UI permite intercalar código HTML.

5.2 Input widget

Los widgets son controles con los que el usuario va a interactuar, es decir que mediante estos controles el usuario va a comunicarse con nuestra aplicacion, filtrar, seleccionar, ingresar un dato por parámetro.

function widget
actionButton Botón para acciones
checkboxGroupInput Un grupo de checkboxes
checkboxInput Un simple checkbox
dateInput Seleccion de una fecha
dateRangeInput Seleccion de un par de fechas
fileInput Subir un archivo
helpText Texto de ayuda para otro control
numericInput Campo para insertar un dato numérico
radioButtons Un grupo de radio buttons
selectInput Clasica caja con opciones para seleccionar
sliderInput Control para seleccionar un dato numérico
submitButton Un boton de submit
textInput Campo para ingresar un dato de texto

Output de algunos widgets:

Probemos algunos de ellos usando, como base, el layout del ejemplo anterior:

library(shiny)
## 
## Attaching package: 'shiny'
## The following objects are masked from 'package:DT':
## 
##     dataTableOutput, renderDataTable
## The following object is masked from 'package:geosphere':
## 
##     span
fluidPage(
  titlePanel("Mi primera Shiny App"),
  sidebarLayout(
    sidebarPanel(
      numericInput("numInput", "Ingresa un número:", value = 7, min = 1, max = 30),
      actionButton("MiBoton","Boton"),
      checkboxInput("MiCheBox", "CheckBox", FALSE)
      ),
    mainPanel(
      p(strong("bold font "), em("italic font")),
      p(code("code block")),
      a(href="http://rusersgroup.com/", "R User Group"))
  )
)

Mi primera Shiny App

bold font italic font

code block

R User Group