Установка «response_to» вне действия

Ответ от Ricardo Saporta очень хороший, и я использовал для решения аналогичной проблемы, но я также хотел добавить решение для кода.

Для кэширования я использовал digest::digest(), где я только что накормил список параметров для этого конкретного графа для этой функции для создания хеш-строки. Первоначально я думал, что мне нужно будет извлечь хэш-строку из observe(), а затем использовать stat if / else, чтобы определить, следует ли мне отправить его на renderImage() или renderPlot() на основе того, было ли ранее создано изображение. Некоторое время я с этим справился, а затем наткнулся на использование renderImage(). Это не идеальная подстановка изображения, а более близкая для целей этой демонстрации.

ui.R

library(shiny)

fluidPage(
  sidebarLayout(
    sidebarPanel(
       sliderInput("bins",
                   "Number of bins:",
                   min = 1,
                   max = 50,
                   value = 25),
      selectInput("plot_color", "Barplot color",
                   c("green"="green",
                      "blue"="blue"))
    ),
    mainPanel(
       plotOutput("distPlot", width='100%', height='480px')
    )
  )
)

и server.R

library(shiny)

function(input, output) {

base <- reactive({
  fn <- digest::digest(c(input$bins, input$plot_color))
  fn})

output$distPlot <- renderImage({
    filename <- paste0(base(), ".png")
    if(filename %in% list.files()){
      list(src=filename)
    } else {
    x  <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    png(filename)
    hist(x, breaks = bins, col = input$plot_color, border = 'white')
    dev.off()
list(src=filename)
    }

  }, deleteFile = FALSE)
}
0
задан Sergei Struk 25 February 2015 в 12:12
поделиться