У меня есть панель инструментов в 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
и, таким образом, сбрасывают другие графики.