Ответ от 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)
}