Обновление графика в R без воссоздания виджета при изменении данных графика - PullRequest
0 голосов
/ 12 мая 2018

Каждый раз, когда R-объект создается плотно, (или просто в R), виджет воссоздается полностью. Для небольших наборов данных это не проблема, но я работаю с графиками, которые содержат тысячи точек разброса, поэтому требуется 10-20 секунд для воссоздания графика в моем shinyapp.

Я ищу способ обновления данных с помощью 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)

1 Ответ

0 голосов
/ 12 мая 2018

Посмотрите на эти ресурсы, которые могут быть полезны для вашего случая:

  1. Plotly R book by Carson Sievert главы 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)
...