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
<- fluidPage(
ui 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?
<- fluidPage(
ui fileInput("upload", NULL, Label = "Upload...", multiple = TRUE),
tableOutput("files")
)<- function(input, output, session) {
server $files <- renderTable(input$upload)
output }
- 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$upload
valeNULL
cuando 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
accept
es 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:
<- fluidPage(
ui fileInput("upload", NULL, accept = c(".csv", ".tsv")),
numericInput("n", "Rows", value = 5, min = 1, step = 1),
tableOutput("head")
)
<- function(input, output, session) {
server <- reactive({
data req(input$upload)
<- tools::file_ext(input$upload$name)
ext 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")
)
})
$head <- renderTable({
outputhead(data(), input$n)
}) }
5.2 Descarga
5.2.1 Interfaz de usuario
<- fluidPage(
ui downloadButton("download1"),
downloadLink("download2")
)
<- function(input, output, session) {} server
downloadButton()
está asociado no una función de tipo render
, sino a downloadHandler()
, de la siguiente manera:
<- fluidPage(
ui downloadButton("download")
)
<- function(input, output, session) {
server $download <- downloadHandler(
outputfilename = 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
<- fluidPage(
ui selectInput("dataset", "Pick a dataset", ls("package:datasets")),
tableOutput("preview"),
# downloadButton("download", "Download .tsv")
downloadButton("download", "Download .csv")
)
<- function(input, output, session) {
server <- reactive({
data <- get(input$dataset, "package:datasets")
out if (!is.data.frame(out)) {
validate(paste0("'", input$dataset, "' is not a data frame"))
}
out
})
$preview <- renderTable({
outputhead(data())
})
$download <- downloadHandler(
outputfilename = 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.
<- fluidPage(
ui sliderInput("n", "Number of points", 1, 100, 50),
downloadButton("report", "Generate report")
)
<- function(input, output, session) {
server $report <- downloadHandler(
outputfilename = "report.html",
content = function(file) {
<- list(n = input$n)
params
<- showNotification(
id "Rendering report...",
duration = NULL,
closeButton = FALSE
)on.exit(removeNotification(id), add = TRUE)
::render("report.Rmd",
rmarkdownoutput_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.