繁体   English   中英

如何从 R Shiny 应用程序下载四开本 pdf 报告

[英]how to download quarto pdf reports from R Shiny application

我正在尝试根据用户提供的输入下载 pdf/docx/html 报告。 为此,我创建了一个 Shiny 应用程序和一个带有参数的 qmd 文件。 当我单独渲染它时,qmd 文件工作正常。 但是,如果我呈现相同的文档并尝试从 Shiny 下载它,它就无法工作。 这是我的downloadHandler

output$report <- downloadHandler(
filename = function() {
  paste("report", input$report_file_type, sep = ".")
},

content = function(file) {
  output <- quarto::quarto_render(
    input = 'report_template.qmd',
    output_format = input$report_file_type,
    execute_params = list(name = input$author_name,
                          report_title = input$report_title)
  )
  file.copy(output, file)
}

)

编辑:这里是 qmd 报告模板

---
title: "`r params$report_title`"
author: "`r params$name`"
date: "`r format(Sys.time(), '%d %B, %Y')`"
format: html
embed-resources: true
params:
  report_title: "report title"
  name: "author name"
  p_list: list("A", "B")
---

Printing each element of the list...

```{r}
#| echo: true
for(p in eval(parse(text = params$p_list))){
  print(p)
}
```

Printing the list...
```{r}
#| echo: true
print(eval(parse(text = params$p_list)))
```

我没有收到任何错误,但同时没有任何内容被写入下载文件夹。 似乎呈现的文档没有分配给output 也许这就是应对线路不起作用的原因。 可能是什么问题以及如何解决? 提前致谢。

quarto::quarto_render不返回生成的文件或任何东西,因此您代码中的outputNULL ,因此您没有得到任何 output。

现在要使此代码正常运行,我们需要将quarto::quarto_render生成的文件复制到传递给downloadHandlercontent参数的 function 的file参数中。

shinyApp(
  
  # UI -----------------------------------------------------------
  ui = fluidPage(
    textInput("author_name", "Author Name", "John Doe"),
    textInput("report_title", "Report Title", "Quarto From Shiny"),
    radioButtons(
      inputId = "report_file_type",
      label = "Report Type",
      choices = c("HTML" = "html", "PDF" = "pdf")
    ),
    downloadButton("report", "Generate report")
  ),
  
  # SERVER --------------------------------------------------------
  server = function(input, output) {
    
    output$report <- downloadHandler(
      filename = function() {
        paste("report", input$report_file_type, sep = ".")
      },
      content = function(file) {
        quarto::quarto_render(
          input = "report_template.qmd",
          output_format = input$report_file_type,
          execute_params = list(
            name = input$author_name,
            report_title = input$report_title
          )
        )
        # copy the quarto generated file to `file` argument.
        generated_file_name <- paste("report_template", input$report_file_type, 
                                     sep = ".")
        file.copy(generated_file_name, file)
      }
    )
  }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM