【问题标题】:Update plotly in R without recreating widget when plotted data is altered更改绘图数据时,在 R 中进行绘图更新而不重新创建小部件
【发布时间】:2018-10-22 14:37:46
【问题描述】:

每当 R 在 Shiny 中(或仅在 R 中)创建 plotly 对象时,都会完全重新创建小部件。对于小型数据集,这不是问题,但我正在处理包含数千个散点的图,因此在我的 shinyapp 中重新创建图需要 10-20 秒。

我正在寻找一种通过 javascript 解决方案更新数据的方法,该解决方案不会触发小部件重建,而只是替换它的数据。

这是一个虚拟应用程序,其中包含 2 个小数据集,应用程序可以在这些数据集之间切换。 在虚拟应用程序中,它通过重新创建小部件来实现。由于数据点有限,这里的速度相当快,但对于海量数据集来说并不理想。

如果有人知道如何做到这一点,那将是对我的应用程序的重大改进。

澄清: 像这样的答案在这里:enter link description here 不会对我有用。关键是,在我的应用程序中,数据在绘图构建后多次更改,因此我无法预加载数据框列表。

我觉得解决方案必须是一个 javascript 解决方案,它可以抓取数据以覆盖当前绘制的数据,但不确定如何或是否可以做到这一点。

library("shiny")
library("plotly")

ui <- fluidPage(
  selectInput("dataset", "Choose a dataset:", choices = c("rock", "mtcars")),

  plotlyOutput("Plot1")
)


server <- function(input, output, session) {

  dataSource <- reactive({switch(input$dataset,"rock" = rock,"mtcars" = mtcars)})

  output$Plot1 <-  renderPlotly({plot_ly(data = dataSource(), x = dataSource()[,1], 
                                         y =dataSource()[,2], mode = 'markers', type = 'scatter')})
}

shinyApp(ui, server)

【问题讨论】:

    标签: javascript r shiny plotly


    【解决方案1】:

    查看这些可能对您的案例有用的资源:

    1. Plotly R bookCarson Sievert 第 3、4 和 6 章
    2. Plotly proxy function explanation

    这是帮助您入门的代码。您需要做一些工作来调整轴标签,但这应该不是那么困难。

    希望这会有所帮助!

    代码:

        library("shiny")
        library("plotly")
    
        ui <- fluidPage(
                selectInput("dataset", "Choose a dataset:", choices = c("rock", "mtcars")),
    
                plotlyOutput("Plot1")
        )
    
    
        server <- function(input, output, session) {
    
                dataSource <- reactive({switch(input$dataset,"rock" = rock,"mtcars" = mtcars)})
    
                output$Plot1 <-  renderPlotly({plot_ly(data = rock, x = ~area, 
                                                       y =~peri, mode = 'markers', type = 'scatter')})
    
                observeEvent(input$dataset, {
                        f <- list(
                                family = "Courier New, monospace",
                                size = 18,
                                color = "#7f7f7f"
                        )
                        x <- list(
                                title = "x Axis",
                                titlefont = f, 
                                range = c(0, 1000)
                        )
                        y <- list(
                                title = "y Axis",
                                titlefont = f,
                                range = c(0, 100)
                        )
                        plotlyProxy("Plot1", session) %>%
                                plotlyProxyInvoke("addTraces", list(x = dataSource()[,1], 
                                                                    y = dataSource()[,2],
                                                                    type = 'scatter',
                                                                    mode = 'markers')) %>% 
                                plotlyProxyInvoke("deleteTraces", list(as.integer(0))) %>% 
                                plotlyProxyInvoke("relayout", list(xaxis = x, yaxis = y))
                })
    
    
    
        }
    
        shinyApp(ui, server)
    

    【讨论】:

    • 嘿 Valter,这看起来很有前途。我会玩弄它以熟悉它并对其进行调整,以便它在我的应用程序中工作。快速跟进问题,如果有多个痕迹,我如何删除所有现有痕迹(我的模型在每次运行时创建“n”组,这决定了痕迹,我需要清除所有痕迹)
    • 好的,想出了如何做到这一点,但不知道如何为每个因素添加跟踪。将在其上发布一个新的 SO 问题
    • 非常感谢瓦尔特的帮助!可以在这里找到:stackoverflow.com/questions/50329111/…
    • 有趣的是,我刚刚用两个 5000*100 大小的 dfs 数据集进行了测试,我看不出重建小部件和 proxyinvoke 之间有什么区别。两者都非常快(1 秒渲染时间)。此外,当我将它放在我的主应用程序中时,两者都运行得很快,直到我加载了我的应用程序处理的其他数据,然后突然所有情节动作再次变慢(渲染 10 秒)。开始认为是整体内存容量
    • 我已经设法添加了更多的痕迹,看看你的新问题的答案......
    猜你喜欢
    • 2020-12-24
    • 2017-04-09
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2022-09-29
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多