Shiny con MiniUI

El paquete miniUI, permite la creación de aplicaciones que muestran gráficos o resultados muy puntuales, las funciones del paquete se basan principalmente en la estructura que tienen los títulos y las subdivisiones o pestañas de la aplicación. Por lo tanto sólo son funciones que se aplican usualmente en la descripción de la interfaz (UI) de un documento Shiny.

Para instalar el paquete miniUI usamos el comando siguiente:

devtools::install_github("rstudio/miniUI")

Luego de instalar el paquete, veamos la estructura que debe tener el documento para crear la aplicación.

Para indicar que es una aplicación miniUI, se usa la función miniPage() y dentro de ésta se colocan títulos y las subdivisiones, generalmente llamadas cajas flexibles. Para la creación de estas partes de la aplicación se usan las funciones siguientes:

  • gadgetTitleBar()/miniTitleBar()

  • miniContentPanel()

  • miniTabstripPanel()

  • miniButtonBlock()

A continuación vamos a describir cada una de estas funciones y mostraremos algunos ejemplos de su uso.

Función miniPage()

miniPage(..., title = NULL, theme = NULL)

Las aplicaciones con miniUI comienzan con la función miniPage(), esta función puede contener “cajas flexibles” llamadas así por la flexibilidad que se tiene de pasar de una a otra. Los argumentos de la función son los siguientes:

  • title: El título o nombre de la aplicación.

  • theme: Estilo de la aplicación.

  • ... Otros elementos que puede tener la página.

Con esta función indicamos la creación de una página (minipage), ahora debemos especificar el título y las subdivisiones de la página.

Para el título utilizamos las siguientes funciones, contenidas en dicho paquete.

Función gadgetTitleBar() ó miniTitleBar()

miniTitleBar(title, left = NULL, right = NULL)

gadgetTitleBar( title, left = miniTitleBarCancelButton(), right = miniTitleBarButton("done", "Done", primary = TRUE))

Estas funciones se usan para colocar el título y los botones a la aplicación, estos botones van a los lados del título. Los argumentos que usan son:

  • title : El título de la aplicación “gadget”.

  • left : Esta opción es para colocar botones en la parte superior izquierda, una opción es usar miniTitleBarButton(), la función gadgetTitleBar() trae por defecto miniTitleBarCancelButton() (Botón que dice “cancel”).

  • right : Igualmente se usa para agregar un botón, pero éste se coloca en la parte superior derecha, se puede usar la función miniTitleBarButton, la función gadgetTitleBar() trae por defecto miniTitleBarButton("done", "Done", primary = TRUE) (Botón que dice “Done”).

A continuación vamos a crear una aplicación, con el título Aplicación miniUI y vamos a agregar dos botones uno en el lado derecho y otro en el lado izquierdo, los cuales llamaremos “derecho” y “izquierdo”, respectivamente.

library(shiny)
library(miniUI)

ui <- miniPage(
    gadgetTitleBar( "Aplicación miniUI",
                    left = miniTitleBarButton("iz", "Izquierdo", primary = TRUE),
                    right = miniTitleBarButton("de", "Derecho", primary = TRUE))
)

server <- function(input, output, session) {

}

shinyApp(ui, server)

Podemos apreciar el resultado en la imagen siguiente:

Función miniContentPanel()

miniContentPanel(..., padding = 15, scrollable = TRUE)

Ahora dentro de la página minipage vamos a agregar las cajas flexibles, podemos específicar las distancias entre las cajas y los límites de la página (rellenos “padding”) y/o la barra de desplazamientos (scroll), se crea mediante la función miniContentPanel. Los parámetros son los siguientes:

  • ... : Se puede colocar un “htmlwidget” o un gráfico.

  • padding : Puede ser tipo texto o numérico, representa el espacio que hay entre el gráfico, o lo que se esté mostrando en la caja, y los lados de la página, puede ser en píxeles o caracteres, si se coloca un solo valor, toma éste para cada uno de los lados, también se le puede específicar un valor para cada lado, es decir un vector de la forma padding = c(top, right, bottom, left) con los valores correspondientes. un ejemplo del valor tipo caracter es “3em”.

  • scrollable: Este parámetro indica si se quiere la barra de desplazamientos en el lado izquierda de la página. Es un valor lógico, verdadero (TRUE) o falso (FALSE).

A continuación se puede apreciar un ejemplo de un minipage que muestra dos histogramas, uno asociado a una distribución Weibull y otro a una distribución Normal, estos estarán dentro de un miniContentPanel que los separán de los límites 2 píxeles y contendrá la barra de desplazamiento.

library(shiny)
library(miniUI)

ui <- miniPage(
  gadgetTitleBar( "Aplicación miniUI",
                  left = miniTitleBarButton("iz", "Izquierdo", primary = TRUE),
                  right = miniTitleBarButton("de", "Derecho", primary = TRUE)),
  miniContentPanel(padding = 2,scrollable = TRUE,
                   plotOutput("hist1"),
                   plotOutput("hist2")
  )
)

server <- function(input, output, session) {
  output$hist1 <- renderPlot({
    hist(rweibull(100, shape = 1.2), col="green")
  })
  output$hist2 <- renderPlot({
    hist(rnorm(100), col="blue")
  })
}

Función miniTabstripPanel()

miniTabstripPanel(..., id = NULL, selected = NULL, between = NULL)

Esta función es el equivalente a los tabsetPanel que se usan en Shiny, recordemos que estas son pestañas (tabs) dentro de la página, donde cada pestaña (tab) muestra algo distinto. Cada una de las pestañas se crea con la función miniTabPanel().

  • ... : Se especifican los elementos miniTabPanel que corresponden a cada pestaña.

  • id : Puedes usar un input$id para seleccionar cual de las pestañas estará activa.

  • selected : Para especificar una de las pestañas por defecto. Si es NULL la primera pestaña es seleccionada.

  • between : Para colocar una pestaña o una lista de pestañas entre el contenido y un tabstrip abajo.

Los parámetros correspondientes a la función miniTabPanel() son:

miniTabPanel(title, ..., value = title, icon = NULL)

  • title : Título del tab.

  • ... : Elementos del tab.

  • value : El valor que se guarda si el tab es seleccionado, en caso de omitir el id toma por defecto el título del tab.

  • icon : Ícono que aparece en el tab. icon(name, class = NULL, lib = "font-awesome").

Se pueden consultar las listas de íconos disponibles a través de la página de Fontawesome y la de Bootstrap.

A continuación vamos a programar una aplicación con un tabstrip de dos tabs, en el primer tab mostraremos el histograma de unos datos que se distribuyen Weibull y en el segundo tab un histrograma de datos que se distribuyen normales.

library(shiny)
library(miniUI)

ui <- miniPage(
  gadgetTitleBar( "Aplicación miniUI",
                  left = miniTitleBarButton("iz", "Izquierdo", primary = TRUE),
                  right = miniTitleBarButton("de", "Derecho", primary = TRUE)),
  miniTabstripPanel(
                    miniTabPanel( "Histograma de Weibull", icon = icon("line-chart"),
                                  plotOutput("hist1") ),
                    miniTabPanel( "Histograma de Normal", icon = icon("line-chart"),
                                  plotOutput("hist2") )
  )
)


server <- function(input, output, session) {
  output$hist1 <- renderPlot({
    hist(rweibull(1000, shape = 1.2), col="green")
  })
  output$hist2 <- renderPlot({
    hist(rnorm(1000), col="blue")
  })
}

shinyApp(ui, server)

Cuando se selecciona el primer tab en la aplicación nos apararece el histograma de una distribución Weibull con 1000 datos.

Cuando se selecciona el segundo tab apararece el histograma de una distribución Normal con 1000 datos.

Función miniButtonBlock()

Esta función se utiliza para crear un contorno para un botón o varios. Esta función consta de dos parámetros:

  • ... : Aquí se colocan los botones actionButton().

  • border : Indica que lados tendrán borde, una línea. Éste puede ser top, bottom o ambos, por defecto es top.

Antes de mostrar un ejemplo hablemos un poco de los actionButton(), estos son llamados botones de acción porque al presionarlos generan nuevamente los cálculos que se muestran en el tab, la manera de usarlos es colocar el input de dicho botón en la parte del server antes de lo que se vaya a mostrar en la pestaña correspondiente. A continuación crearemos una aplicación miniUi que muestra el histograma de una distribución Normal y la cual tiene un actionButton que cada vez que se presione generará un histograma con los datos que se distribuyen Normal.

library(shiny)
library(miniUI)

ui <- miniPage(
  gadgetTitleBar( "Aplicación miniUI",
                  left = miniTitleBarButton("iz", "Izquierdo", primary = TRUE),
                  right = miniTitleBarButton("de", "Derecho", primary = TRUE) ),
  miniContentPanel(
    miniTabPanel( "Histograma de la Normal", icon = icon("line-chart"),
                  plotOutput("hist"),
                  miniButtonBlock( border=c("top","bottom"),
                    actionButton("reset", "Resetear los datos")
                  )
    )
  )
)


server <- function(input, output, session) {
  output$hist <- renderPlot({
    input$reset
    hist(rnorm(1000), col="blue")
  })

}

shinyApp(ui, server)

Ahora con este paquete podemos crear aplicaciones sencillas que muestran los datos puntuales sobre algún trabajo especifico que se quiera realizar, creando cajas flexibles que combinen todas las funciones aquí explicadas.

Para más información puede consultar la documentación oficial de miniUI y en el artículo sobre gadgets. En estos links encontrará información adicional, más detalles y ejemplos de suma utilidad.

Copyright © 2014-2018 Synergy Vision. Los artículos del Corpus se comparten bajo los términos de la licencia Creative Commons con Reconocimiento, Propósito no comercial, Compartir contenido similar, 4.0 Internacional (CC BY-NC-SA 4.0).

Citar el artículo.