可以预先计算ggplot直方图吗?

时间:2015-10-26 19:27:29

标签: r ggplot2 shiny

是否可以预先计算ggplot直方图的值?计算一些直方图确实减慢了我的ShinyR应用程序,因此我想找到一种缓存直方图的方法,因此它们只针对给定的一组参数计算一次。我检查了docs,但没有看到任何相关信息。抱歉,如果我错过了什么,但是有人可以指出我有关如何做到这一点的文件,或者告诉我它不可能吗?

1 个答案:

答案 0 :(得分: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)

然后可以使用loadsave函数加载和保存cachedData列表。