5 Cargas y descargas
En este capítulo, exploraremos cómo Shiny nos permite realizar un análisis predeterminado de datos que cargamos a una aplicación Shiny; además de descargar data procesada o el resultado de un reporte parametrizado.
5.1 Carga
5.1.1 Interfaz de usuario
ui <- fluidPage(
fileInput(id = "carga", label = "Cargar un archivo")
)5.1.2 Función de servidor
Ejemplo de dataset: write.csv(iris,"ruta_para_archivo/nombre.csv, row.names = FALSE)
¿Qué valor asume fileInput() tras cargar un archivo?
ui <- fluidPage(
fileInput("upload", NULL, Label = "Upload...", multiple = TRUE),
tableOutput("files")
)
server <- function(input, output, session) {
output$files <- renderTable(input$upload)
}- name: Nombre del archivo cargado.
- size: Tamaño, en bytes, del archivo.
- type: Especificación formal del tipo archivo cargado.
- datapath: La data cargada se guarda en un folder temporal, con un nombre temporal. datapath es la ruta de tal data cargada al servidor.
5.1.3 Cargar datos
input$uploadvaleNULLcuando se carga la página. Por ello, usaremosreq(input$upload)para que su código relevante se ejecute cuando el archivo haya sido cargado.El argumento
acceptes un intento de limitar qué tipo de archivos pueden añadirse para ser cargados. Obtendremos la extensión del archivo víatools::file_ext().
Ejemplo:
ui <- fluidPage(
fileInput("upload", NULL, accept = c(".csv", ".tsv")),
numericInput("n", "Rows", value = 5, min = 1, step = 1),
tableOutput("head")
)
server <- function(input, output, session) {
data <- reactive({
req(input$upload)
ext <- tools::file_ext(input$upload$name)
switch(ext,
csv = vroom::vroom(input$upload$datapath, delim = ","),
tsv = vroom::vroom(input$upload$datapath, delim = "\t"),
validate("Invalid file; Please upload a .csv or .tsv file")
)
})
output$head <- renderTable({
head(data(), input$n)
})
}5.2 Descarga
5.2.1 Interfaz de usuario
ui <- fluidPage(
downloadButton("download1"),
downloadLink("download2")
)
server <- function(input, output, session) {}downloadButton() está asociado no una función de tipo render, sino a downloadHandler(), de la siguiente manera:
ui <- fluidPage(
downloadButton("download")
)
server <- function(input, output, session) {
output$download <- downloadHandler(
filename = function() {
paste0(input$dataset, ".csv")
},
content = function(file) {
write.csv(data(), file)
}
)
}- filename: Función sin argumentos que define el nombre del archivo por descargar.
- content: Función con único argumento file, la ruta donde se guardará el archivo.
5.2.2 Descargar data
ui <- fluidPage(
selectInput("dataset", "Pick a dataset", ls("package:datasets")),
tableOutput("preview"),
# downloadButton("download", "Download .tsv")
downloadButton("download", "Download .csv")
)
server <- function(input, output, session) {
data <- reactive({
out <- get(input$dataset, "package:datasets")
if (!is.data.frame(out)) {
validate(paste0("'", input$dataset, "' is not a data frame"))
}
out
})
output$preview <- renderTable({
head(data())
})
output$download <- downloadHandler(
filename = function() {
# paste0(input$dataset, ".tsv")
paste0(input$dataset, ".csv")
},
content = function(file) {
# vroom::vroom_write(data(), file)
write.csv(data(), file)
}
)
}5.2.3 Descargar reportes
Primero, hay que definir qué es un reporte parametrizado, creado con R Markdown.
ui <- fluidPage(
sliderInput("n", "Number of points", 1, 100, 50),
downloadButton("report", "Generate report")
)
server <- function(input, output, session) {
output$report <- downloadHandler(
filename = "report.html",
content = function(file) {
params <- list(n = input$n)
id <- showNotification(
"Rendering report...",
duration = NULL,
closeButton = FALSE
)
on.exit(removeNotification(id), add = TRUE)
rmarkdown::render("report.Rmd",
output_file = file,
params = params,
envir = new.env(parent = globalenv())
)
}
)
}La ruta del reporte parametrizado debe estar contenida dentro de la ruta de la aplicación Shiny que está siendo ejecutada.
5.3 Tarea
Hacer los ejercicios 2 y 3 de esta sección.