Si no tiene instalado R y RStudio (se aconseja tener ambos) puede realizar estos ejercicios online accediendo mediante algún explorador al sitio web de RStudio Cloud realizando login a través de diferentes opciones entre las que se encuentra acceder a través de una cuenta en Google.

Disclaim: En este archivo hay imágenes de cómo se ven las aplicaciones en el viewer de RStudio pero no son interactivas, es un archivo estático.

La dinámica de uso de este tutorial es la siguiente: lea la explicación del código que aparece, luego copie ese mismo script (todo el chunk) en su sesión de trabajo de R o RStudio y ejecútelo. Realice los ejercicios indicados para cada sección.

Para estos ejercicios serán necesarios los paquetes tidyverse, gapminder y shiny.

library(shiny)
library(tidyverse)
library(gapminder)

UI y Servidor

Las aplicaciones shiny constan básicamente de dos partes: la interfaz de usuario (UI) y el servidor. La UI es donde se determina la forma que tomará la aplicación y el servidor contiene las funciones que se aplicarán. Se debe crear la UI (User Interface), que en este caso llamaremos IdU y también es necesario definir el servidor. Para definir la UI hay varios comandos, habremos de usar el comando fluidPage(). Para crear el servidor se usará function(), que finalmente será donde se defina lo que se deben hacer en la UI. La aplicación es lanzada con la función shiny::shinyApp():

IdU <- fluidPage(
        '¡Hola shiny!'
)

duque <- function(input, output){
        
}

shinyApp(ui = IdU, server = duque)

Ejercicio

  • Reflexione sobre el código y la salida en html.
  • ¿Qué hace el servidor?

Caja de texto

En el siguiente ejemplo creamos una caja de texto para escribir en ella. El nombre que asignamos a la caja de texto es “caja”:

interfaz <- fluidPage(
  textInput("caja", label="Cosas")
)

mi_servidor <- function(input, output) {

  
}

shinyApp(ui = interfaz, server = mi_servidor)

Ejercicio

Escriba en la caja de texto qué fue lo último que se comió ayer, bórrelo y ahora escriba qué fue lo último que comió hoy.

Renderizar texto

La renderización es la acción de llevar a cabo las órdenes dadas por un usuario para que sean representadas de manera gráfica en la UI. Requiere de órdenes de entrada y de salida. En este ejercicio creamos una caja (entrada) que recibe texto y arrojauna frase (salida) que es alimentada con lo que se introduce en la caja, en este caso se pide un nombre y se imprime en la salida:

ui <- fluidPage(
        textInput("nombre", "¿Cuál es tu nombre?"),
        textOutput("existe")
)

server <- function(input, output) {
        output$existe <- 
                renderText(
                        paste("Si", input$nombre, "piensa, entonces existe. Pero si", input$nombre, "existe, eso no quiere decir que piense."))
        
        
}

shinyApp(ui = ui, server = server)

Ejercicio

Escriba su nombre de pila. Lea la frase. Borre su nombre, ahora ponga su apodo y vuelva a laeer la frase.

Renderizando un gráfico

El siguiente ejericicio pone una palabra en una caja de texto y también pone un gráfico estático de ggplot2. Es de recalcar que aquí se debe renderizar el gráfico en el servidor con renderPlot({}) en un objeto dentro del output: output$graf <- renderPlot({}), para que luego la variable graf esté disponible para el output en la UI con la función plotOutput() que debe contener el nombre del gráfico entre comillas, en este caso sería "graf":

library(ggplot2)

ui <- fluidPage(
        textInput('algo', 'Escriba algo', 'Unas flores'),
        plotOutput("graf")
)
server <- function(input, output, session) {
        output$graf <- renderPlot({
                ggplot(data  = iris, aes(Sepal.Length, Petal.Width, col=Species)) +
                        geom_point()
                
        })
        
        
}
shinyApp(ui = ui, server = server)

Cabe aclarar que en este ejemplo no hay una interacción que relacione la caja de texto con el gráfico de ggplot2.

Ejercicio

Reflexione sobre el código y la salida en html.

Filtros por categorías de una variable

Para los siguientes ejercicios se hace uso del operador pipe (%>%) disponible en el paquete tidyverse.

Con el dataset iris se hará un scatterplot de las variables Sepal.Length y Sepal.Width. La aplicación permitirá escoger las categorías de la variable Species como filtros para la visualización:

ui <- fluidPage(
        titlePanel("Escoja la especie de iris"),
        selectInput("Especie",
                    "Escoja especie",
                    selected = "setosa",
                    choices=c("setosa", "versicolor", "virginica")),
        plotOutput('graf_iris')
)

server <- function(input, output){
        output$graf_iris <- renderPlot({
                escoger <- iris %>% 
                        filter(Species == input$Especie)
                ggplot(escoger, aes(x = Sepal.Length, y = Sepal.Width)) +
                        geom_point()
        })
}

shinyApp(ui = ui, server = server)

Ejercicio

Haga uso del filtro de la lista desplegable y explique la app.

Sliders

Con el dataset gapminder se realiza a continuación un scatterplot de la expectativa de vida contra el logaritmo de producto interno bruto per cápita con un slider que filtra por año y una lista desplegable que filtra según continente:

ui <- fluidPage(
        titlePanel("Unas cifras"),
        selectInput('continente', 'Seleccione el continente',
                    choices = c("Africa", "Americas", "Asia", "Europe", "Oceania")),
        sliderInput("year",
                    "Deslice el año",
                    value = 1957,
                    min = 1957,
                    max = 2007),
        plotOutput('grafico')
)

server <- function(input, output, session){
        output$grafico <- renderPlot({
                gapminder %>%
                        filter(continent == input$continente, year == input$year) %>%
                        ggplot(aes(lifeExp, log(gdpPercap), size=pop)) +
                        geom_point(alpha = 0.7)
        })
}

shinyApp(ui = ui, server = server)

Ejercicio

  • Haga modificaciones del filtro de selección y del slider.
  • ¿Hay información para todos los años?
  • ¿Para qué años existe información?

Tablas

En este ejemplo se realiza una tabla que filtra según el número de cilindros y el cilindraje.

ui <- fluidPage(
        titlePanel("Ejercicio con mpg"),
        selectInput('cilindros', 'Seleccione el número de cilindros', choices = c("4", "5", "6", "8")),
        sliderInput('motor', 'Seleccione el cilindraje x100', min = 16, max = 70, value = 25),
        tableOutput("tabla_carros_output")
)
server <- function(input, output, session){
        tabla_carros <- function(){
                tabla_carros <- mpg %>% 
                        mutate(cilindraje = displ*10) %>%
                        filter(cyl == input$cilindros) %>% 
                        filter(cilindraje == input$motor)
        }
        output$tabla_carros_output <- renderTable({
                tabla_carros()
        })
}
shinyApp(ui = ui, server = server)

Ejercicio

  • Realice filtros con la lista desplegable y con el slider.
  • ¿Cuántos carros hay en el dataset que tengan 8 cilindros y 4200 cc?
  • ¿Qué marcas tienen carros de 5000 cc?