R Shiny如何显示在" downloadHandler"中生成的pdf文件

时间:2016-09-19 18:46:01

标签: r 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'
     )
  }
))

1 个答案:

答案 0 :(得分:1)

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

  1. 在Shiny项目根目录下创建一个www文件夹
  2. msaPrettyPrint的文件参数指向www/myreport.pdf
  3. 动态添加iframe以显示文件。请注意,在iframe中,您直接指向myreport.pdf而没有www,因为Shiny会自动在www文件夹中查找静态/媒体文件。
  4. 请参阅下面的工作示例(注意我这里没有使用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)