11

私たちの光沢のあるアプリを介して生成されたプロットをキャッシュできるトリック/方法があるかどうか疑問に思っています.

バックグラウンド:

最終的にプロットになる計算集約的な計算を行っています。私はすでに(memoiseを使用して)計算をキャッシュしていますが、グローバルに光沢がありますが、プロットをレンダリングするにはまだ約.75秒かかります。画像のレンダリングにかかる​​時間をなくすことでその時間を短縮できるかどうか、またそれを行うための巧妙な方法がすでにあるかどうかを考えていました。

詳細:

私はグリッドを使用してプロット(この場合はヒートマップ)を作成しています。理想的には、メモリにプロットを保存してもスケールアップしないため、キャッシングをディスクベースにしたいと考えています。

ありがとう!-アビ

4

3 に答える 3

3

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)
}
于 2017-09-09T15:10:44.530 に答える