event_data ('plotly_relayout') изменяется на начальные значения после изменения размера окна браузера - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть панель инструментов в Shiny, использующая в основном библиотеку shinydashboard. Первая панель посвящена анализу временных данных с большим количеством переменных во времени. Поэтому я использую начальный график, созданный с помощью plotly, и использую rangeslider для выбора определенных временных интервалов. Затем я хочу использовать метки времени, созданные ползунками, в качестве пределов для дальнейшего анализа с другими переменными, но в том же интервале времени, который был выбран на первом графике.

Для достижения этого я использую event_data('plotly_relayout'), указывая наИсходный сюжет.

Теперь, что происходит, когда я выбираю положения ползунка, даты устанавливаются и используются на последующих графиках. Но если масштаб окна браузера изменяется, эти значения сбрасываются на некоторые начальные значения ползунка, которые имеют значение «ширина» и height.

Я перепробовал все возможные условия, чтобы обойти эту проблему, но в концеЯ не могу найти решение, чтобы избежать сброса значений при изменении размера окна браузера. Я пробовал другие источники event_data (), например plotly_click, plotly_doubleclick, plotly_selected, и все работает нормально. Только не с ползунками и plotly_relayout.

Если вы запустите код ниже, посмотрите на переменные xmin и xmax после закрытия приложения. Есть случаи:

(I) Запуск приложения -> ничего не делать -> закрыть окно -> переменные остаются пустыми (это нормально)

(II) Запуск приложения -> изменить размер окна ->закрыть окно -> переменные имеют значения width и height

(III) Запуск приложения -> изменить ползунки -> закрыть окно -> переменные имеют значения дат

(IV) Запуск приложения -> изменить ползунки -> изменить размер окна -> закрыть окно -> переменные имеют начальные значения width и height

if (interactive()) {
   library(shiny)
   library(plotly)
   # Download some data
   getSymbols(Symbols = 'AAPL')

   ds <- data.frame(Date = index(AAPL), AAPL[,6])

   ui <- fluidPage(plotlyOutput('plot'))

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

      output$plot <- renderPlotly({
         plot_ly(ds, x = ~Date, y = ~AAPL.Adjusted, type = 'scatter', mode = 'lines + markers', name = 'Some Name', source = 'timeline_plot') %>% 
            layout(
               title = 'Stock Prices',
               xaxis = list(rangeslider = list(type = 'date')),
               yaxis = list(title = 'Price'))
      })

      observeEvent(event_data('plotly_relayout', source = 'timeline_plot'), {
         event.data <<- event_data('plotly_relayout', source = 'timeline_plot')

         if(is.null(event.data[['xaxis.range']]) == TRUE){
            xmin <<- event.data[[1]]
            xmax <<- event.data[[2]]
         }else{
            xmin <<- event.data[['xaxis.range']][1]
            xmax <<- event.data[['xaxis.range']][2]
         }
      })
   }

   shinyApp(ui, server)

}

При условии, что я объявляю event.data <- <code>event_data('plotly_relayout') какв приведенном выше коде начальные значения при изменении размера окна равны event.data$witdth и event.data$height, которые являются значениями ползунка в некоторой единице и представлены в виде целого числа.

Как только я использую ползунок для установки диапазона дат, эти значения превращаются в список с двумя значениями event.data[['xaxis.range']][1] и event.data[['xaxis.range']][2]. Класс этих значений меняется на характер.

Класс не имеет значения в этом случае, так как я могу справиться с этими вещами на последующих графиках.

Но что происходит сейчас, так это то, что после выбора значений ползунка и изменения размера панелиразмер, в котором находятся графики, изменяя размеры окна браузера или просто используя боковую панель с shinydashboard, или используя другие элементы из пакета shinyWidgets, которые изменяют размер исходного графика. Значения event.data изменяются на исходные значения width и height и, таким образом, сбрасывают другие графики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...