【问题标题】:R Shiny how to display a pdf file generated in "downloadHandler"R Shiny如何显示在“downloadHandler”中生成的pdf文件
【发布时间】:2017-01-27 13:11:54
【问题描述】:

我是 Shiny 的新手,想知道是否有办法显示在“downloadHandler”中生成的 pdf 文件?

我正在使用一个包做一些生物学分析,我可以让它在downloadHandler中创建一个pdf文件。但是,如果我可以查看此 pdf 而不是下载它,我仍然在苦苦挣扎。

此问题与Shiny to output a function that generates a pdf file itself 有关。 请参阅下面的代码,以了解适用于下载 pdf 输出的代码。非常感谢!

library(shiny)
library(msa)
runApp(list(
   #Load the exmaple from the msa package.
   mySequenceFile <- system.file("examples", "exampleAA.fasta", package="msa"),
   mySequences <- readAAStringSet(mySequenceFile),
   myFirstAlignment <- msa(mySequences),
   # A simple shiny app.
   # Is it possible to see the generated pdf file on screen?
   ui = fluidPage(downloadButton('downloadPDF')),
   server = function(input, output) {
       output$downloadPDF = downloadHandler(
       filename = 'myreport.pdf',
       content = function(file) {
            msaPrettyPrint(
                myFirstAlignment
              , file = 'myreport.pdf'
              , output="pdf"
              , showNames="left"
              , showLogo="top"
              , consensusColor="BlueRed"
              , logoColors="accessible area"
              , askForOverwrite=FALSE)
       file.rename("myreport.pdf", file) # move pdf to file for downloading
       },
       contentType = 'application/pdf'
     )
  }
))

【问题讨论】:

  • Adam,您能告诉我如何为新生成的 pdf 文件找到正确的 src 路径(即 src=...)吗?我在 Mac 上本地运行。我很努力,但找不到正确的方法。非常感谢!

标签: r shiny


【解决方案1】:

如果您打算显示 pdf,则不应使用 downloadHandler。相反,只需使用您的 pdf 打印功能生成 pdf 文件,但关键是

  1. 在 Shiny 项目根目录下创建一个 www 文件夹
  2. msaPrettyPrint的文件参数指向www/myreport.pdf
  3. 动态添加 iframe 以显示文件。请注意,在 iframe 中,您直接指向 myreport.pdf 而没有 www,因为 Shiny 会自动在 www 文件夹中查找静态/媒体文件。

请参阅下面的工作示例(注意我在这里没有使用 msa 包,但想法应该是相同的)。

library(shiny)

ui <- shinyUI(fluidPage(

   titlePanel("Old Faithful Geyser Data"),

   sidebarLayout(
      sidebarPanel(
        actionButton("generate", "Generate PDF")
      ),

      mainPanel(
         uiOutput("pdfview")
      )
   )
))

server <- shinyServer(function(input, output) {

  observeEvent(input$generate, {
    output$pdfview <- renderUI({
      pdf("www/myreport.pdf")
      hist(rnorm(100))
      dev.off()
      tags$iframe(style="height:600px; width:100%", src="myreport.pdf")
    })
  })
})

shinyApp(ui = ui, server = server)

【讨论】:

  • 您好 warmoverflow,非常感谢您的帮助。我无法运行上面的代码。但是,如果我将代码拆分为两个闪亮的文件(即 ui.R 和 service.R),它运行良好。你的代码可以在你的系统上运行吗?我正在使用 RStudio 版本 0.99.903、R 3.3.1、Shiny 0.14、Mac OS X El Capitan。
  • 它在我的 Windows 机器上运行没有问题。不确定它是否与 OS X 相关。您在代码中看到了哪些错误消息?
  • 它只是说找不到文件...无论如何,至少两个文件代码有效。非常感谢您的帮助!
  • 我刚在 Linux 机器上试了一下,单文件代码就可以了。确保在运行之前创建 www 文件夹。无论如何,请将问题标记为已回答。
猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 2021-09-03
  • 2017-08-13
  • 2020-04-26
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多