Shiny es un paquete de R que permite construir aplicaciones web interactivas directamente desde R. La información que se presentará a continuación es basada en los tutoriales de shiny disponibles en RStudio.
Estructura de una aplicación
Las aplicaciones Shiny se escriben en un script simple con nombre App.R. Este script tiene dos componentes:
- Un objeto de interfaz de usuario:
ui()
- Una función del servidor:
server()
El objeto ui()
controla la apariencia de la aplicación, mientras que la función server()
contiene las instrucciones para construir la aplicación.
library(shiny) # Estructura de una aplicación ui <- ... server <- ... shinyApp(ui = ui, server = server)
Primer ejemplo
El primer y más sencillo de los ejemplos es Ejemplo_1, el cual grafica un histograma del conjunto de datos de R con un número de intervalos dinámico. El usuario puede cambiar el número de intervalos con un deslizador y la aplicación inmediatamente responderá a la entrada.
Para ejecutar el ejemplo original “Hello Shiny”, escriba:
library(shiny) runExample("01_hello")
¿Cómo se ejecuta una aplicación?
Se puede ejecutar una aplicación Shiny usando el nombre de la carpeta como parámetro de la función runApp
. Para nuestro primer ejemplo, tengo una carpeta llamada Ejemplo_1, entonces ejecutamos:
library(shiny) runApp("Ejemplo_1")
Otra manera de ejecutarla, es abrir el script App.R
en el editor de RStudio. RStudio reconocerá el script Shiny y proporcionará un botón Run App
(en la parte superior derecha del editor).
Ejercicio 1
Cree una nueva carpeta llamada “App_1” en el directorio de trabajo. Luego, copie y pegue el código de Hello Shiny y guardalo como App.R dentro de la carpeta creada.
Luego, haga algunos cambios en su aplicación:
Cambie el título de “Hello Shiny!”.
Cambie el valor mínimo y máximo del deslizador.
Cambie el color del borde y barras del histograma.
Por defecto, las aplicaciones Shiny se muestran en modo “normal”, es decir, sin el script. Para que se muestre junto a la aplicación el script, se debe establecer en modo “showcase”, para ello se agrega lo siguiente:
runApp("App_1", display.mode = "showcase")
Ejemplos predeterminados en Shiny
El paquete Shiny tiene once ejemplos incorporados que muestran a grandes razgos como funciona.
library(shiny) runExample ("01_hello") # histograma runExample ("02_text") # resumen y tabla runExample ("03_reactivity") # desplegables reactivos runExample ("04_mpg") # boxplot reactivos runExample ("05_sliders") # deslizadores reactivos runExample ("06_tabsets") # varias pestanas runExample ("07_widgets") # textos de ayuda y botones runExample ("08_html") # Shiny desde HTML runExample ("09_upload") # carga de archivos runExample ("10_download") # descarga de archivos runExample ("11_timer") # dia y hora
Interfaz ui
Shiny usa la función fluidPage()
para crear una pantalla que se ajusta automáticamente a las dimensiones de la ventana del navegador. El diseño de la interfaz de usuario consiste en colocar elementos en esta función.
Los dos elementos más populares que se adicionan a fluidPage()
son titlePanel()
y sidebarLayout()
, está última tiene dos argumentos :
La función
sidebarPanel()
.La función
mainPanel()
.
ui <- fluidPage( titlePanel("Título"), sidebarLayout(position = "left", sidebarPanel("panel lateral"), mainPanel("panel principal") ) ) server <- function(input, output) {} shinyApp(ui = ui, server = server)
El panel de la barra lateral aparecerá por defecto en el lado izquierdo de la aplicación. Se puede mover hacia el lado derecho dando el argumento opcional position = "right"
.
titlePanel()
y sidebarLayout
crean un diseño básico para la aplicación Shiny, pero también se pueden crear diseños más avanzados.
Se puede usar navbarPage()
para proporcionarle a la aplicación una interfaz de usuario de varias páginas que incluya una barra de navegación. También se puede usar fluidRow()
para crear un diseño desde un sistema de cuadrícula.
La guía completa la pueden encontrar en Guía de diseño
Contenido Shiny en HTML
Función Shiny | Resultado |
---|---|
p | párrafo de texto |
h1, h2, … h6 | encabezados por niveles |
br | cambiar de renglón |
div | divición de texto |
span | línea con estilo |
img | imagen |
strong | texto en negrita |
em | texto en cursiva |
HTML | código HTML |
Encabezados
Seleccionar una función de encabezado (h1, h2, … h6) y asignar el texto que desea ver en el encabezado. Se pueden colocar varios elementos en el mismo panel si los separa con una coma.
library(shiny) ui <- fluidPage( titlePanel(h1("Encabezados")), sidebarPanel( h1("First level title"), h2("Second level title"), h3("Third level title"), h4("Fourth level title"), h5("Fifth level title"), h6("Sixth level title"))) server <- function(input, output) {} shinyApp(ui = ui, server = server)
En general, se puee usar cualquier atributo de etiqueta HTML como argumento en una función de etiqueta Shiny. Para más detalles conculta: w3schools.
library(shiny) ui <- fluidPage( titlePanel(h1("Star Wars App")), sidebarPanel( h6("Shiny:", align = "center"), h5("una nueva esperanza", align = "center"), h4("es un periodo de cambios"), h3("conoceras cosas impactantes"), h2("es muy importante aprenderlas"), h1("para ser el mejor"))) server <- function(input, output) {} shinyApp(ui = ui, server = server)
Formato de texto
library(shiny) ui <- fluidPage( titlePanel("My Shiny App"), mainPanel( p("p crea un parrafo de texto."), p("Un nuevo p() inicia un nuevo párrafo. Puede cambiarse su estilo.", style = "font-family: 'times'; font-si16pt"), strong("strong() texto en negrita."), br(), em("em() texto en cursiva."), br(), code("code() texto subrallado similar al de la computadora"), div("div() segmentos de texto con estilo similar y se puede cambiar de color con: 'style = color:blue' ", style = "color:blue"), br(), p("span() es igual a div(), pero trabaja en", span("grupos de palabras", style = "color:orange"), "que pueden estar dentro de u párrafo.")) ) server <- function(input, output) {} shinyApp(ui = ui, server = server)
Imágenes
Shiny usa la función img()
para colocar archivos de imagen en su aplicación.
Para insertar una imagen, debes colocar tres argumentos:
img(src = "mi_imagen.png", height = 72, width = 72)
La función img()
busca el archivo de imagen en una carpeta de nombre www
, el cual debe estar en el mismo directorio que el archivo App.R
.Para observar un ejemplo, descargue la carpeta: Ejemplo_imagen
Para obtener mayor información sobre las funciones etiquetas adicionales consulta: Personalice ui con HTML y Glosario de etiquetas HTML de Shiny.
Widgets de control
Los Widget()
son elementos web con los que el usuario puede interactuar, proporcionando una forma de intercambiar valores u opciones.
Los widgets estándar se Shiny son:
Función Shiny | Widget |
---|---|
actionButton() |
botón de acción |
checkInput() |
casilla de verificación |
checkboxGroupInput() |
grupo de casillas de verificación |
dateInput() |
calendario para selección de una fecha |
dateRangeInput() |
dos calendarios para seleccionar un rango de fechas |
Función Shiny | Widget |
---|---|
fileInput() |
carga de archivos |
helpText() |
texto de ayuda |
numericInput() |
campo para ingresar números |
radioButtons() |
conjunto de botones de selección múltiple de única respuesta |
selectInput() |
cuadro con opciones para seleccionar |
sliderInput() |
deslizador |
submitButton() |
botón de enviar |
textInput() |
ingresar texto |
Agregar un widget
Para agregar un widget()
a la aplicación, se puede agregar en sidebarPanel()
o en mainPanel()
dentro del objeto ui.
Los primeros dos argumentos para cada widget son:
- Nombre para el widget: el usuario no verá este nombre, pero es necesario en el código, para poder acedera él.
- Etiqueta: será el nombre que el usuario podrá ver en la aplicación
Los argumentos restantes varían de un widget a otro. Éstos pueden ser valores iniciales, rangos o incrementos.
La aplicación Ejemplo_widgets muestra los diferentes widgets disponibles.
Para más información, pueden ver la Galería de Widgets.
Salida reactiva
En una salida reactiva se puede agregar cualquier salida de R, la cual responde automáticamente cuando un usuario cambia el valor de un widget.
Se pueden crear resultados reactivos en un proceso de dos pasos:
- Agregar un objeto R a la
ui()
. - Indicar a Shiny cómo construir el objeto en la función server. El objeto será reactivo al enlazarlo con un widget.
Paso 1: Objetos de R en el ui()
Función Output | Crea |
---|---|
dataTableOutput() |
tabla de datos |
imageOutput() |
imagen |
plotOutput() |
gráfico |
tableOutput() |
tabla |
textOutput() |
texto |
verbatimTextOutput() |
texto latex |
Paso 2: Construcción del objeto en el server()
Esto se debe hacer en la función server()
, la cual crea un objeto de nombre output
que contiene todo el código necesario para actualizar los objetos R de la aplicación.
Cada objeto R necesita tener su propia entrada, cuyo nombre debe coincidir con el elemento reactivo que se creó en la ui()
.
Un aplicación con el ui()
y el server()
se muestra en: Ejemplo_salida_reactiva.
Cada entrada en el objeto output
debe ser el resultado de una función render
de Shiny, la cual captura y procesa una expresión R. Se debe usar la función render
que corresponde al tipo de objeto reactivo que se está creando.
Función render | Crea |
---|---|
renderDataTable() |
tabla de datos |
renderImage() |
imagen |
renderPlot() |
gráfico |
renderPrint() |
cualquier salida impresa |
renderTable() |
tabla |
renderText() |
texto |
Ejercicio 2
Crea una segunda aplicación personalizada, donde puedas incluir una salida reactiva. Puedes partir del ejemplo presentado.