每次R由 Shiny (或仅在R中)创建一个可打印对象时,将完全重新创建该小部件。对于小数据集,这不是问题,但是我正在处理包含成千上万个散点的图,因此需要10到20秒才能在我的Shinyapp中重新创建图。

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

这是一个具有2个小数据集的虚拟应用程序,可以在这些数据集之间进行切换。
在虚拟应用程序中,它是通过重新创建小部件来完成的。由于数据点有限,此处速度相当快,但不适用于海量数据集。

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

要澄清:
这里的答案是这样的:enter link description here不会帮我这个忙。关键是,在绘制 plotly 之后,我的应用程序数据会多次更改,因此我无法预加载数据帧列表。

我觉得该解决方案必须是一个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)

最佳答案

看一下对您的案例可能有用的以下资源:

  • Plotly R book,由Carson Sievert第3、4和6章
  • 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)
    

    关于javascript - 更改绘图数据后,在R中以图形方式更新而无需重新创建小部件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50304835/

    10-12 18:09
    查看更多