Ricardo Saporta からの回答は非常に優れており、同様の問題を解決するために使用したものですが、コードソリューションも追加したかったのです。
キャッシュにはdigest::digest()
、その特定のグラフのパラメーターのリストをその関数に渡してハッシュ文字列を作成する場所を使用しました。最初は、ハッシュ文字列を抽出しobserve()
、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)
}