Después de interactuar con una aplicación Shinny y obtener cierto resultado, los usuarios suelen querer descargar un informe HTML o PDF. Se puede agregar fácilmente la capacidad de generar un informe con Knitr y rmarkdowun a una aplicación Shinny con un solo botón.

Hay dos partes ecesnciales para esto:

Ejemplo

Esta app toma un valor de entrada, y lo pasa como un parametro a un documento .Rmd, que se coplila en un archivo HTML. Puedes ver esta app en acción aqui

Código

library(shiny)
shinyApp(
  ui = fluidPage(
    sliderInput("slider", "Slider", 1, 100, 50),
    downloadButton("report", "Generate report")
  ),
  server = function(input, output) {
    output$report <- downloadHandler(
      # Para la salida en PDF, usa "report.pdf"
      filename = "report.html",
      content = function(file) {
        # Copia el reporte a un directorio temporal antes de porcesarlo, en 
        #caso de que no tengamos permiso de escritura en el directorio actual
        #puede ocurrir un error
        tempReport <- file.path(tempdir(), "report.Rmd")
        file.copy("report.Rmd", tempReport, overwrite = TRUE)

        # configurar los parametros para pasar al documento .Rmd
        params <- list(n = input$slider)

        #Copilar el documento con la lista de parametros, de tal manera que se 
        #evalue de la misma manera que el entorno de la palicacipon.
        rmarkdown::render(tempReport, output_file = file,
          params = params,
          envir = new.env(parent = globalenv())
        )
      }
    )
  }
)
Shiny applications not supported in static R Markdown documents

Plantilla .Rmd

report.Rmd:

#```{r}
# El objeto parametros esta`params` en el documento. 
#params$n
#```

#Se modifica desde la app y se opera con ellos en el documento Rmd. Por ejemplo en esta app se hace una grafica de una muestra aleatoria normal.

#```{r}
#plot(rnorm(params$n), rnorm(params$n))
#```

Tenga en cuenta que debido a un problema en el paquete rmarkdown, el valor predeterminado de un parámetro en el encabezado YAML no puede ser NULL, por lo que hemos utilizado NA como valor predeterminado de n.

Notas

La función rmarkdowun::render() tiene muchas opciones de control para el procesamiento y la salida. Ver rmarkdown website para aprender más. Algunas opciones comúnmente usadas son descritas a continuación.

Por defecto, un archivo HTML generado por rmarkdown::render() tendrá todas las graficas y otras imágenes del que se manejen en el código R por lo que no tendrá necesidad de manejarlas por separado.

Si en lugar de un archivo HTML usted quiere un reporte PDF tendra que cambiar las siguientes opcciones.