Ошибка регистрации событий Plotly в приложении Shiny в неподходящий момент

#r #shiny #r-plotly #ggplotly

#r #блестящий #r-plotly #ggplotly

Вопрос:

Я борюсь с прослушивателем событий plotly, который, кажется, активен после предполагаемого момента. У меня есть два метода выбора диапазона дат — a sliderInput и plotlyOutput график. В то время как Shiny reactivity и plotly event_register, как правило, отвечают по назначению, plotly event_register также срабатывает в нежелательный момент — когда пользователь делает selectInput выбор после нажатия кнопки для сброса после более раннего plotlyOutput выбора диапазона перетаскивания.

введите описание изображения здесь

Приложение ниже воспроизводит проблему. Помощь очень ценится.

 require(tidyverse)
require(shiny)
require(plotly)

d = as_tibble(EuStockMarkets) %>% mutate(date = Sys.Date()   (-1860:-1)) %>% 
  pivot_longer(-date, names_to = 'market')

ui = fluidPage(
  sidebarPanel(width = 3,
               h5('Persistent sparkline to show full date range'),
    plotOutput("sparkline", height = '100px'),
    sliderInput('date_range', 'Date range', min = min(d$date), max = max(d$date),
                value = range(d$date), step = 1, timeFormat = '%d %b %y'),
    actionButton('reset_date_range', 'Reset sliderInput to full range', style='height: 25px; padding: 2px 5px;'),
    hr(),
    selectInput('market', 'Market', choices = unique(d$market), selected = 'DAX'),
    h4('Steps to reproduce the problem:'),
    p('1. Drag a date range in the big (plotly) plot. This will apply to sliderInput and main plot will update as intended.'),
    p('2. Click the button to reset the range.'),
    p('3. Select a new market.  The sliderInput will revert to the last plotly plot's drag range despite the reset.'),
    h5('Plotly event_register response:'),
    verbatimTextOutput("brushed")
  ),
  mainPanel(width = 9, plotlyOutput('plot', height='80vh'))
)

server = function(input, output, session) {
  
  r = reactiveValues() # my app requires a reactive data object
  
  observeEvent(input$market, {
    r$dat = d %>% filter(market == local(input$market))  # filter reactive data

    # Sparkline plot
    output$sparkline = renderPlot({
      d %>% filter(market == input$market) %>% 
        qplot(date, value, label = round(value), geom = 'line', data = .)  
        geom_text(data = function(x){ filter(x, value %in% range(value))}, size = 4)  
        theme_void()   scale_y_continuous(expand = c(0.2, 0.2))
    }, bg="transparent")
    
    # Plotly timeline plot
    output$plot = renderPlotly({
      p = r$dat %>% qplot(date, value, data = ., geom = 'line')   theme_minimal()
      ggplotly(p) %>% layout(dragmode = "select") %>% event_register("plotly_brushed")
    })
    
    output$brushed <- renderPrint({
      e_dat = event_data("plotly_brushed")
      if(length(na.omit(e_dat$x)) == 2){
        sliderRange <<- as.Date(e_dat$x, origin='1970-01-01')
        updateSliderInput(session, 'date_range', value = sliderRange)
        sliderRange <<- NULL # test to ensure e_dat$x isn't persisting somehow
      }
      print(e_dat)
    })
    
  })
  
  # update reactive r$dat if the slider used
  observeEvent(input$date_range, {
    r$dat = d %>% filter(market == local(input$market), date >= input$date_range[1], date <= input$date_range[2])
  })
  
  # reset date selection
  observeEvent(input$reset_date_range, {
    date_range = range(d$date, na.rm = TRUE)
    updateSliderInput(session, 'date_range', min = date_range[1], max = date_range[2], value = date_range)
  })
  
}

shinyApp( ui = ui, server = server)
  

Ответ №1:

Ошибка новичка .. мне output$brushed <- renderPrint({ ... }) просто нужно выйти за пределы observeEvent(input$market, ...) предложения.