在闪亮的应用程序中缓存基本 ggplot 并允许动态修改图层(leafletProxy 等效于 ggplot)

Posted

技术标签:

【中文标题】在闪亮的应用程序中缓存基本 ggplot 并允许动态修改图层(leafletProxy 等效于 ggplot)【英文标题】:Cache a base ggplot in a shiny app and allow modification of layers dynamically (leafletProxy equivalent for ggplot) 【发布时间】:2017-01-29 12:31:14 【问题描述】:

如果显示的基本数据集很大(下面的示例工作代码),则在闪亮的应用程序中向/从 ggplot 添加/删除层可能需要一段时间。

问题是:

有没有办法缓存 ggplot(基本图)并添加/删除/修改额外(动态)图层,而无需在闪亮的应用程序中重做整个图? 也就是说,一个等效于 leafletProxy() 的函数用于传单地图(参见 leaflet Rstudio webpage 中的工作示例)。

*** thread 中提出了一种可能的解决方法(下例中的选项 B),但是,它不会阻止 ggplot 重做整个绘图。

示例工作代码:

library(shiny)
library(ggplot2)

shinyApp(
  shinyUI(
    fluidPage(
      sidebarLayout(
        sidebarPanel(
          checkboxInput("line", "Add line")
        ),
        mainPanel(
          plotOutput("plot")
        )
      )
    )
  ),
  shinyServer(function(input, output, session) 
    data(diamonds)
    vals <- reactiveValues(pdata=ggplot())

    observeEvent(input$line, 
      p <- ggplot(diamonds, aes(x=carat, y=depth)) + geom_point()
      if (input$line)
        lineData <- data.frame(x=c(1, 4), y = c(60, 75))
        p <- p + geom_line(data = lineData, aes(x=x, y=y), color = "red")
      
      vals$pdata <- p
    )
    # Option A ------
    # output$plot <- renderPlot(
    #     vals$pdata
    # )
    #
    # Option B ------
    observeEvent(vals$pdata,
      output$plot <- renderPlot(
        isolate(vals$pdata)
      )
    )

  )
)

【问题讨论】:

【参考方案1】:

您总是可以只制作两个图,然后使用条件来选择要显示的图。初始渲染很慢,但在初始化后效果很好。

library(shiny)
library(ggplot2)

shinyApp(
  shinyUI(
    fluidPage(
      sidebarLayout(
        sidebarPanel(
          checkboxInput("line", "Add line", value = TRUE)
          ),
        mainPanel(
          conditionalPanel(condition = 'input.line == false',
                           plotOutput("plot1"),
                           ),
          conditionalPanel(condition = 'input.line == true',
                           plotOutput("plot2"),
                           ),
          )
        )
      )
    ),
  shinyServer(function(input, output, session) 
    #data(diamonds)


    # Option C -------
    output$plot1 <- renderPlot(
      ggplot(diamonds, aes(x=carat, y=depth)) + geom_point()
    )
    output$plot2 <- renderPlot(
      lineData <- data.frame(x=c(1, 4), y = c(60, 75))

      ggplot(diamonds, aes(x=carat, y=depth)) + 
        geom_point()+
        geom_line(data = lineData, aes(x=x, y=y), color = "red")
    )

  )
)

【讨论】:

以上是关于在闪亮的应用程序中缓存基本 ggplot 并允许动态修改图层(leafletProxy 等效于 ggplot)的主要内容,如果未能解决你的问题,请参考以下文章

我在闪亮的应用程序中的ggplot将不会显示数据表中的值,只显示一个点

闪亮的应用程序中的ggplotly不断崩溃(Rstudio)

在闪亮的应用程序中将 ggplot 对象转换为 plotly

如何在带有 ggplotly() 的闪亮应用程序中使用 plotlyProxy() 以使绘图渲染得更快

ggplot 和dashboardPage 的闪亮不起作用

在ggplot中使用过滤器时闪亮的范围滑块错误