为什么plotly_legenddoubleclick变得不同步?

问题描述 投票:0回答:1

我尝试捕获

plotly_legenddoubleclick
事件以触发第二个图中的样式事件。当用户双击图例组时,该组会使用不透明度“hack”在相应的散点图中突出显示。实际上,这适用于第一组双击,但会变得不同步并最终停止工作。

以下行为的 MWE 和 GIF。

library(shiny)
library(plotly)

data = iris

ui <- fluidPage(
    mainPanel(
      plotlyOutput("bp"),
      plotlyOutput("sc")
    )
)

server <- function(input, output) {
  
  serv_data <- reactive({ df <- data })
  
  output$bp <- renderPlotly({
    fig <- plot_ly(
      data,
      source = "boxplot",
      y = ~Sepal.Length,
      color = ~Species,
      type = "box"
    ) %>%
      event_register("plotly_legenddoubleclick")
  })
  
  output$sc <- renderPlotly({
    if(!is.null(legend_data$data)) {
      df <- legend_data$data
    }else{
      df <- data
      df$opacity <- 0.75
    }
    
    fig <- plot_ly(
      df,
      source = "scatter",
      x = ~Sepal.Width,
      y = ~Sepal.Length,
      type = "scatter",
      mode = "markers",
      color = ~Species,
      opacity = ~opacity
    )
  })

  ## Double click stuff
  legend_data <- reactiveValues(data = NULL)
  
  observeEvent(event_data("plotly_legenddoubleclick", source = "boxplot"), {
    clicked_data <- event_data("plotly_legenddoubleclick", source = "boxplot")
    if (is.null(legend_data$data)) {
      clicked_species <- clicked_data$name
      mat <- serv_data()
      mat <- mat %>% mutate(opacity = ifelse(Species == clicked_species, 1.0, 0.2))
      legend_data$data <- mat
    } else {
      legend_data$data <- NULL
    }
  })
  
  
}

shinyApp(ui = ui, server = server)

enter image description here

r shiny plotly
1个回答
0
投票

第二次“取消选择”某组时,会出现错误显示,例如:第二次双击

versicolor
后在 GIF 中。这是因为您在
observeEvent
上有一个
event_data("plotly_legenddoubleclick", source = "boxplot")
,并且不会触发此操作,因为在
event_data
中,绘图的“重置”已经具有存储空间。

你需要做的就是始终触发重新执行。来自

?event_data

论据

...

priority:对应闪亮输入值的优先级。如果 等于“event”,则event_data()总是触发重新执行, 而不是仅当相关闪亮输入值时才重新执行 更改(默认)。

您需要

priority = "event"
(而不是默认的
"input"
),因此您可以将
observeEvent
中的条件更改为以下内容,它将起作用:

observeEvent(event_data(
  "plotly_legenddoubleclick",
  source = "boxplot",
  priority = "event"
), {
  # your Code as above 
}
© www.soinside.com 2019 - 2024. All rights reserved.