在一个闪亮的应用程序中,如何在源文件更改时强制和嵌入pdf查看器进行刷新

时间:2016-11-11 12:21:53

标签: r pdf shiny r-markdown

我已经使用this answer在我的闪亮应用中嵌入了pdf。当我首先通过闪亮的UI输入生成pdf并使用操作按钮“提交”时,pdf将从UI输入生成并在Viewer中显示。

但是,当我通过UI更改文档并再次提交时,即使文件内容已更改,查看器仍会显示旧报告。

如何强制它显示新的pdf?

这是我的问题的可重复示例,在浏览器中打开时效果最佳。

ui.R

library(shiny)

shinyUI(fluidPage(

  # Application title
  titlePanel("Old Faithful Geyser Data"),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      textInput("textin", label = "text input")
      , actionButton("makepdf", "Make pdf")
    ),

    mainPanel(
      htmlOutput("pdfviewer")
    )
  )
))

server.R

library(shiny)
shinyServer(function(input, output) {
observeEvent(input$makepdf,{
  title <- input$textin
  print(title)
  pdf("www/test.pdf")
  plot(mtcars$mpg,mtcars$disp, main = title)
  dev.off()
})


 observeEvent(input$makepdf,({
   output$pdfviewer <-renderText({
    return(paste('<iframe style="height:600px; width:100%" src="'," test.pdf", '"></iframe>', sep = ""))
    })
  })
)

})

重新购买的步骤:

  1. 在浏览器中启动应用
  2. 在“文字输入”框中输入任意内容,然后点击“制作pdf”
  3. 在“文字输入”框中输入不同的内容,然后点击“制作pdf”
  4. 观察pdf查看器仍显示步骤2的输出,即使www文件夹中的源文件将显示步骤3中所做的更改。

1 个答案:

答案 0 :(得分:1)

我不知道为什么这样做而不是我的问题中的脚本,但是根据this answer使用renderUI和标签$ iframe解决了这个问题。我欢迎任何解释,为什么一个工作,而不是另一个。

将server.ui更改为以下内容:

library(shiny)
shinyServer(function(input, output) {
  observeEvent(input$makepdf,{
    title <- input$textin
    print(title)
    pdf("www/test.pdf")
    plot(mtcars$mpg,mtcars$disp, main = title)
    dev.off()
  })

  output$pdfviewer<- renderUI({
       if((input$makepdf)<1) return()
       test <- " test.pdf"
       my_test <- tags$iframe(src=test, height=600, width = "100%")#, width=535
       print(my_test)
       return({my_test})
                             })

})