2016-11-11 1 views
0

Я использовал this answer для вставки pdf-файла в мое блестящее приложение. Когда я впервые создаю PDF через блестящие входы пользовательского интерфейса и «отправляю» с помощью кнопки действия, pdf создается из входов интерфейса и отображается в режиме просмотра.В блестящем приложении, как я могу заставить и встроенный просмотрщик PDF обновиться при изменении исходного файла

Однако, когда я меняю документ с помощью пользовательского интерфейса и снова представляю, просмотрщик все еще отображает старый отчет, даже если содержимое файла изменилось.

Как я могу заставить его отображать новый 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 = "")) 
    }) 
    }) 
) 

}) 

Шаги к reporoduce:

  1. Запуск приложения в браузере
  2. Тип ничего в "ввода текста" окно и нажмите «Сделать pdf»
  3. Введите что-то другое в поле «текстовый ввод» и нажмите «Сделать pdf»
  4. Обратите внимание, что программа просмотра PDF по-прежнему показывает результат с шага 2, хотя исходный файл в вашей папке www отображает изменение, сделанное на шаге 3.

ответ

1

Я не знаю, почему это работает вместо скрипта в моем вопросе, но с использованием renderUI в сочетании с тегами $ iframe по this answer решает проблему. Я приветствую любые объяснения относительно того, почему один работает, а не другой.

Изменить 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}) 
          }) 

}) 
+0

После больше опыта я теперь понимаю, почему это правильно по моему исходному примеру. Для любого, кто хочет делать блестящие приложения регулярно, я думаю, что важно понять, что реальная концепция реактивности в блестящей форме, и необходимо смотреть [эти два обсуждения] (https://www.rstudio.com/resources/webinars/shiny-developer-conference /) от Джо Ченга. , – DataJack