class: center, middle, inverse, title-slide .title[ # Introducción a Shiny ] .subtitle[ ## Deploy ] .institute[ ### Estación R ] --- class: center, middle inverse # Deploy --- # Deploy El *deploy* (despliegue) de una Shiny es el último paso para poder compartir nuestra app con otras personas. Necesitamos contar con un servidor acorde para poder alojar nuestra aplicación, es decir, un sistema que pueda ejecutar R y Shiny, con todas sus dependencias. En resumen necesitamos un [Shiny Server](https://posit.co/products/open-source/shinyserver/), una herramienta de código abierto para alojar múltiples aplicaciones en un solo lugar. .pull-left[ <img src="recursos/servidor.jpg" width="1365" /> ] .pull-right[ <img src="recursos/linux.png" width="60%" /> ] --- # Deploy <br> ¿Qué opciones tenemos para desplegar una app? -- - [Posit Connect](https://posit.co/products/enterprise/connect/) -- - [Shiny Server](https://posit.co/download/shiny-server/) -- - [shinyapps.io](https://www.shinyapps.io/) --- # ¿Fuera del server? <br> Otros caminos (experimentales) para compartir nuestra app: - Local: - Scripts de código (¿+ git?): para users de R - Compilar como app desktop con R portable (ej: [DesktopDeployR](https://github.com/wleepang/DesktopDeployR), [RInno](https://github.com/ficonsulting/RInno)) -- - Web: - [Shinylive](https://posit-dev.github.io/r-shinylive/) + [webR](https://docs.r-wasm.org/webr/latest/) -- - No Shiny: - Se puede combinar Rmarkdown o Quarto con paquetes de R para hacer app "estáticas" sencillas. Ej: `flexdashboard` + `crosstalk` --- # Volviendo a Shiny Server... <br> shinyapps.io ofrece una opción gratuita (limitada) para hacer el deploy de nuestra app. Pasos: 1. Crear una cuenta https://www.shinyapps.io/ 2. Generar un token 3. Vincular la cuenta desde Rstudio 4. Publicar la aplicación --- # Deploy 2- Token <img src="recursos/shinyapps_token.png" width="100%" /> --- # Deploy 3- Conexión <img src="recursos/shinyapps_connect.png" width="60%" /> --- # Deploy 4- Publicación <img src="recursos/shinyapps_publish.png" width="60%" /> --- # Deploy <br> ¡Voilá! <img src="recursos/shinyapps_deployed.png" width="100%" /> --- class: center, middle inverse # Buenas prácticas --- # Buenas prácticas <br> -- - Funcionalizar, modularizar, paquetizar -- - Pre-procesar los datos fuera de la app -- - Minimizar la reactividad -- - Documentar y comentar el código -- - Controlar los paquetes y sus versiones ([renv](https://rstudio.github.io/renv/articles/renv.html)) -- - Utilizar control de versiones -- - Testing ([shinytest2](https://github.com/rstudio/shinytest2), [testthat](https://testthat.r-lib.org/index.html), [shinyloadtest](https://rstudio.github.io/shinyloadtest/)) - Profiling([profvis](https://github.com/r-lib/profvis)) --- # Bases de datos e integración Local vs Remoto <img src="recursos/shiny_database.png" width="80%" /> https://shiny.posit.co/r/articles/build/persistent-data-storage/ --- # Ejemplos Probemos distintos enfoques para leer y procesar nuestros datos sobre bosques usados en el taller. ¿Cuánto tarda el proceso de limpieza de datos que hicimos? `recursos/data/limpieza.R` ``` ## 1.85 sec elapsed ``` --- # Ejemplos ¿Y cuánto demora leer los datos? .xlsx ```r tic() xlsx <- readxl::read_excel("recursos/data/data_shiny.xlsx") toc() ``` ``` ## 0.25 sec elapsed ``` .csv ```r tic() csv <- read.csv("recursos/data/data_shiny.csv") toc() ``` ``` ## 0.07 sec elapsed ``` --- # Ejemplos .parquet ```r tic() parquet <- arrow::open_dataset("recursos/data/data_shiny.parquet") toc() ``` ``` ## 0.38 sec elapsed ``` .db ```r tic() db <- DBI::dbConnect(RSQLite::SQLite(), "recursos/data/data_shiny.db") toc() ``` ``` ## 0.11 sec elapsed ``` --- # Peso de los objetos ``` ## [1] "xlsx 666824" ``` ``` ## [1] "csv 613408" ``` ``` ## [1] "parquet 504" ``` ``` ## [1] "db 2176" ```