Cree su primer panel de aplicaciones web con Shiny y R

Uno de los hermosos dones que tiene R (que Python perdió, hasta el tablero) es Shiny . Brillante es un R paquete que hace que sea fácil de construir aplicaciones web interactivas directamente de R . Los paneles son populares porque ayudan a las empresas a obtener información valiosa a partir de los datos existentes.

En esta publicación, veremos cómo aprovechar Shiny para crear un panel simple de ingresos por ventas. Necesitará R instalado.

Carga de paquetes en R

Los paquetes que necesita deben ser descargados por separado, y se instalan usando R . Todos los paquetes enumerados a continuación se pueden instalar directamente desde CRAN, puede elegir qué espejo CRAN usar. Las dependencias de paquetes también se descargarán e instalarán de forma predeterminada.

Una vez instalados los paquetes, debe cargarlos en su sesión de R. Se utilizan la biblioteca y los comandos require y, de nuevo, R también carga automáticamente las dependencias del paquete .

# load the required packageslibrary(shiny)require(shinydashboard)library(ggplot2)library(dplyr)

Archivo de entrada de muestra

Como un panel necesita datos de entrada para visualizar, usaremos recommended.csv como ejemplo de datos de entrada para nuestro panel. Como se trata de un archivo .csv, se utilizó el comando read.csv. La primera fila en .csv es una fila de título, por lo que se usa header = T. Hay dos formas de obtener el archivo recommended.csv en su sesión actual de R:

  1. Abra este enlace - recommended.csv y guárdelo (Ctrl + S) en su directorio de trabajo actual, donde se guarda este código R. Entonces el siguiente código funcionará perfectamente.
recommendation <- read.csv('recommendation.csv',stringsAsFactors = F,header=T)head(recommendation) Account Product Region Revenue1 Axis Bank FBB North 20002 HSBC FBB South 300003 SBI FBB East 10004 ICICI FBB West 10005 Bandhan Bank FBB West 2006 Axis Bank SIMO North 200

2. En lugar de leer el .csv desde su computadora local, también puede leerlo desde una URL (web) usando la misma función read.csv. Dado que este .csv ya está cargado en mi Github, podemos usar ese enlace en nuestro read.csv para leer el archivo.

recommendation <- read.csv('//raw.githubusercontent.com/amrrs/sample_revenue_dashboard_shiny/master/recommendation.csv',stringsAsFactors = F,header=T)head(recommendation) Account Product Region Revenue1 Axis Bank FBB North 20002 HSBC FBB South 300003 SBI FBB East 10004 ICICI FBB West 10005 Bandhan Bank FBB West 2006 Axis Bank SIMO North 200

Descripción general de Shiny

Cada aplicación Shiny tiene dos secciones principales: UI y Server . La interfaz de usuario contiene el código para los botones de interfaz , gráficos de gráficos, pestañas, etc. El servidor contiene el código para la recuperación, manipulación y disputa de datos de back-end.

En lugar de simplemente usar solo Shiny , lo acoplamos con shinydashboard . shinydashboard es un paquete de R cuyo trabajo es facilitar, como su nombre indica, la creación de cuadros de mando con Shiny .

Crear un panel de control poblado: interfaz de usuario

La parte de la interfaz de usuario de una aplicación Shiny creada con shinydashboard tiene 3 elementos básicos incluidos en el comando dashboardPage (). El código Shiny más simple con shinydashboard

## app.R ##library(shiny)library(shinydashboard)ui <- dashboardPage( dashboardHeader(), dashboardSidebar(), dashboardBody())server <- function(input, output) { }shinyApp(ui, server)

da esta aplicación

Poblaremos dashboardHeader()y dashboardSidebar(). El código contiene comentarios, con el prefijo #.

#Dashboard header carrying the title of the dashboardheader <- dashboardHeader(title = "Basic Dashboard") #Sidebar content of the dashboardsidebar <- dashboardSidebar( sidebarMenu( menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")), menuItem("Visit-us", icon = icon("send",lib='glyphicon'), href = "//www.salesforce.com") ))

Se completan los elementos de la interfaz de usuario que nos gustaría mostrar en nuestro panel dashboardPage(). Dado que el ejemplo es un panel de ingresos por ventas, mostremos tres cuadros de Indicador clave de rendimiento (KPI) en la parte superior que representan un resumen rápido, seguido de dos diagramas de cuadro para una vista detallada.

Para alinear estos elementos, uno a uno, los definimos por dentro fluidRow().

frow1 <- fluidRow( valueBoxOutput("value1") ,valueBoxOutput("value2") ,valueBoxOutput("value3"))frow2 <- fluidRow( box( title = "Revenue per Account" ,status = "primary" ,solidHeader = TRUE ,collapsible = TRUE ,plotOutput("revenuebyPrd", height = "300px") ) ,box( title = "Revenue per Product" ,status = "primary" ,solidHeader = TRUE ,collapsible = TRUE ,plotOutput("revenuebyRegion", height = "300px") ) )# combine the two fluid rows to make the bodybody <- dashboardBody(frow1, frow2)

En el código anterior, valueBoxOutput()se utiliza para mostrar la información de KPI. valueBoxOutput()y plotOutput()están escritos en la parte del servidor , que se utiliza en la parte de la interfaz de usuario para mostrar un gráfico. box()es una función proporcionada por shinydashboardpara encerrar la gráfica dentro de una caja que tiene características como title, solidHeadery collapsible. Habiendo definido dos fluidRow()funciones individualmente en aras de la modularidad, combinamos ambas en dashbboardBody().

Por lo tanto, podemos completar la parte de la interfaz de usuario , que comprende el encabezado, la barra lateral y la página, con el siguiente código:

#completing the ui part with dashboardPageui <- dashboardPage(title = 'This is my Page title', header, sidebar, body, skin="red")

El valor de titlein dashboardPage()es el título de la página / pestaña del navegador, mientras que el título definido en dashboardHeader()es visible como el título del tablero.

Crear un panel de control poblado: servidor

Con la parte de la interfaz de usuario terminada, crearemos la parte del servidor donde el programa y la lógica detrás de valueBoxOutput()y plotOutput()se agregan con renderValueBox()y renderPlot()respectivamente. Estos se incluyen dentro de a server function, con inputy output como sus parámetros. Los valores internos inputse reciben de la interfaz de usuario (como textBox valor, Slider valor). Los valores internos output se envían a la interfaz de usuario (como plotOutput, valueBoxOutput).

A continuación se muestra el código completo del servidor :

# create the server functions for the dashboard server <- function(input, output) { #some data manipulation to derive the values of KPI boxes total.revenue <- sum(recommendation$Revenue) sales.account % group_by(Account) %>% summarise(value = sum(Revenue)) %>% filter(value==max(value)) prof.prod % group_by(Product) %>% summarise(value = sum(Revenue)) %>% filter(value==max(value))#creating the valueBoxOutput content output$value1 <- renderValueBox({ valueBox( formatC(sales.account$value, format="d", big.mark=',') ,paste('Top Account:',sales.account$Account) ,icon = icon("stats",lib='glyphicon') ,color = "purple") }) output$value2 <- renderValueBox({ valueBox( formatC(total.revenue, format="d", big.mark=',') ,'Total Expected Revenue' ,icon = icon("gbp",lib='glyphicon') ,color = "green") })output$value3 <- renderValueBox({ valueBox( formatC(prof.prod$value, format="d", big.mark=',') ,paste('Top Product:',prof.prod$Product) ,icon = icon("menu-hamburger",lib='glyphicon') ,color = "yellow") })#creating the plotOutput content output$revenuebyPrd <- renderPlot({ ggplot(data = recommendation, aes(x=Product, y=Revenue, fill=factor(Region))) + geom_bar(position = "dodge", stat = "identity") + ylab("Revenue (in Euros)") + xlab("Product") + theme(legend.position="bottom" ,plot.title = element_text(size=15, face="bold")) + ggtitle("Revenue by Product") + labs(fill = "Region") })output$revenuebyRegion <- renderPlot({ ggplot(data = recommendation, aes(x=Account, y=Revenue, fill=factor(Region))) + geom_bar(position = "dodge", stat = "identity") + ylab("Revenue (in Euros)") + xlab("Account") + theme(legend.position="bottom" ,plot.title = element_text(size=15, face="bold")) + ggtitle("Revenue by Region") + labs(fill = "Region") })}

Hasta ahora, hemos definido las dos partes esenciales de una aplicación Shiny : la interfaz de usuario y el servidor . Finalmente, tenemos que llamar / ejecutar Shiny ,con UI y Server como parámetros.

#run/call the shiny appshinyApp(ui, server)Listening on //127.0.0.1:5101

Todo el archivo R debe guardarse como app.Rdentro de una carpeta antes de ejecutar la aplicación brillante. También recuerde poner el archivo de datos de entrada (en nuestro caso, recommendation.csv)dentro de la misma carpeta que app.R. Si bien hay otra forma válida de estructurar la aplicación Shiny con dos archivos ui.Ry server.R(opcionalmente global.R), se ha ignorado en este artículo por el bien de brevedad ya que está dirigido a principiantes.

Al ejecutar el archivo, la aplicación web Shiny se abrirá en su navegador predeterminado y se verá similar a las capturas de pantalla a continuación:

Hopefully, at this stage, you have this example Shiny web app up and running. The code and plots used here are available on my Github. If you are interested in Shiny, you can learn more from DataCamp’s Building Web Applications in R with Shiny Course.