我尝试捕获
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)
第二次“取消选择”某组时,会出现错误显示,例如:第二次双击
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
}