2015-10-26 81 views
1

是否可以預先計算ggplot直方圖的值?計算多個直方圖確實會減慢我的ShinyR應用程序的速度,所以我想找到一種方法來緩存直方圖,以便只對給定的一組參數計算一次。我檢查了docs,但沒有看到任何關於這個。道歉,如果我錯過了什麼,但可以有人指向我如何做到這一點的文件,或告訴我,這是不可能的?可能預先計算ggplot直方圖?

+0

您可以將圖表保存爲圖像並在正確的時間顯示正確的圖像。 – Gregor

+0

@Gregor但繪製我需要renderPlot和加載圖像我需要renderImage。有沒有辦法在這些之間無縫轉換?似乎我將不得不花很多時間偷偷摸摸地加載某個情節或圖像,不是嗎?這可能會相當混亂。 – sunny

+4

'x < - hist(...,plot = F)'給你休息和計數。你可以使用'geom_bar(...,stat =「identity」)'來繪製它。 – Axeman

回答

2

你可以做這樣的事情:

library(shiny) 
library(ggplot2) 

n <- 400 

server <- function(input, output) { 
    cachedData <<- list() 

    datasetInput <- reactive({ 
    switch(input$dataset, 
      "data1" = list("name"="dataset1", "data"=data.frame("x"=runif(n),"y"=runif(n)), "plot"=NULL), 
      "data2" = list("name"="dataset2", "data"=data.frame("x"=runif(n),"y"=runif(n)), "plot"=NULL), 
      "data3" = list("name"="dataset3", "data"=data.frame("x"=runif(n),"y"=runif(n)), "plot"=NULL)) 
    }) 

    observeEvent(input$run,{ 
    d    <- datasetInput() 
    # If dataset cached 
    if (d$name %in% names(cachedData)){ 

    } 
    # Else cache dataset 
    else{ 
     cachedData[[d$name]] <<- d 
    } 


    # See if data is loaded 
    if (is.null(cachedData[[d$name]]$plot)){ 
     print("Creating Plot") 
     cachedData[[d$name]]$plot <<- ggplot(data=d$data,aes(x=x)) + geom_histogram(stat="bin") 
    } 
    else{ 
     print("Loading plot") 
    } 

    # Else save data 
    output$plot <- renderPlot({ cachedData[[d$name]]$plot}) 
    }) 

} 

ui <- shinyUI(fluidPage(
    selectInput("dataset", "Choose a dataset:", 
       choices = c("data1", "data2", "data3")), 
    plotOutput("plot"), 
    actionButton('run','Generate Plot') 
) 
) 

shinyApp(ui = ui, server = server) 

的cachedData列表然後可以加載和保存與loadsave功能。