更改绘图数据时,在 R 中更新绘图而不重新创建小部件

Mar*_*ark 5 javascript r shiny plotly

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

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

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

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

澄清: 这里的答案是这样的:在此处输入链接描述对我不起作用。关键是,在我的应用程序中,在构建绘图后数据已更改多次,因此我无法预加载数据框列表。

我有一种感觉,解决方案必须是一个 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)
Run Code Online (Sandbox Code Playgroud)

Val*_*vić 5

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

  1. Plotlyř书卡森西弗特章节3,4和6
  2. Plotly 代理函数说明

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

希望这可以帮助!

编码:

    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)
Run Code Online (Sandbox Code Playgroud)