两次单击相同的 plotly 标记不会触发事件两次
clicking same plotly marker twice does not trigger events twice
我正在使用 Plotly 的 event_data("plotly_click")
在用户单击散点图中的标记后执行操作(打开模式)。之后(例如关闭模态),event_data("plotly_click")
当然不会改变并且点击相同的标记因此不会再次触发相同的动作。
最小示例:
library(plotly)
ui <- fluidPage(
plotlyOutput("plot")
)
server <- function(input, output, session) {
output$plot <- renderPlotly({
mtcars %>% plot_ly(x=~disp, y=~cyl)
})
# Do stuff after clicking on a marker in the plot
observeEvent(event_data("plotly_click"), {
print("do some stuff now") # this is not executed after second click on same marker
})
}
shinyApp(ui, server)
我已经尝试使用 shinyjs 的 onclick
解决方法,但无济于事(它在绘图的空白区域效果很好,但在单击标记时效果不佳):
shinyjs::onclick(id="plot", print("clicked"))
我也尝试过使用一个反应值来存储最后一次点击并在之后立即重置(例如 event_data("plotly_hover")
),但是所有尝试都失败了,因为 event_data("plotly_click")
仍然是它的旧值。
有人能帮忙吗?
[编辑:该问题已在 Plotly 4.9.0 中修复。查看答案 . This answer works up to Plotly 4.8.0. From plotly 4.9.0., delete the string .clientValue-
from the source code or use .]
我终于解决了这个问题。我知道这会困扰一些人,所以我会 post 在这里提出我的解决方案:
基本上我使用 shinyjs
包来重置关于某个事件(在我的例子中是一个按钮)的最后一次点击(event_data("plotly_click")
从中获取信息的来源)的数据。
函数的定义是(注意"A"如果使用需要换成plotly-source字符串):
extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('.clientValue-plotly_click-A', 'null'); }")
然后在 js$resetClick()
单击按钮时调用它。
最小示例:
library(shiny)
library(plotly)
library(shinyjs)
ui <- shinyUI(
fluidPage(
useShinyjs(),
# code to reset plotlys event_data("plotly_click", source="A") to NULL -> executed upon action button click
# note that "A" needs to be replaced with plotly source string if used
extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('.clientValue-plotly_click-A', 'null'); }"),
actionButton("reset", "Reset plotly click value"),
plotlyOutput("plot"),
verbatimTextOutput("clickevent")
)
)
server <- shinyServer(function(input, output) {
output$plot <- renderPlotly({
plot_ly(mtcars, x=~cyl, y=~mpg)
})
output$clickevent <- renderPrint({
event_data("plotly_click")
})
observeEvent(input$reset, {
js$resetClick()
})
})
shinyApp(ui, server)
我遇到了同样的问题,并提出了一个解决方案,我将 plotly 对象的 source 参数指定为 reactive value如下:
在 plot_ly(data,x,y,...,source = x)
和 event_data(...,source = x)
中,让 x
成为 reactiveValues
对象的一个元素。当您的事件触发时,更改 x 的值(增量或散列),这会实例化一个新的 event_data()
对象。
工作得很好。
问题终于在 Plotly 方面得到解决:https://github.com/ropensci/plotly/issues/1043
event_data("plotly_click", priority = "event")
每次点击都会更新,而不仅仅是闪亮的输入更改(和以前一样)。从 Plotly 4.9.0 开始工作。
使用 Plotly 4.9.0 的最小示例:
library(shiny)
library(plotly)
ui <- shinyUI(
fluidPage(
plotlyOutput("plot", height = 200),
verbatimTextOutput("time_last_click")
)
)
server <- shinyServer(function(input, output) {
output$plot <- renderPlotly({
plot_ly(mtcars[1,], x=~cyl, y=~mpg, size = 1)
})
output$time_last_click <- renderPrint({
tmp <- event_data("plotly_click", priority = "event")
Sys.time()
})
})
shinyApp(ui, server)
我正在使用 Plotly 的 event_data("plotly_click")
在用户单击散点图中的标记后执行操作(打开模式)。之后(例如关闭模态),event_data("plotly_click")
当然不会改变并且点击相同的标记因此不会再次触发相同的动作。
最小示例:
library(plotly)
ui <- fluidPage(
plotlyOutput("plot")
)
server <- function(input, output, session) {
output$plot <- renderPlotly({
mtcars %>% plot_ly(x=~disp, y=~cyl)
})
# Do stuff after clicking on a marker in the plot
observeEvent(event_data("plotly_click"), {
print("do some stuff now") # this is not executed after second click on same marker
})
}
shinyApp(ui, server)
我已经尝试使用 shinyjs 的 onclick
解决方法,但无济于事(它在绘图的空白区域效果很好,但在单击标记时效果不佳):
shinyjs::onclick(id="plot", print("clicked"))
我也尝试过使用一个反应值来存储最后一次点击并在之后立即重置(例如 event_data("plotly_hover")
),但是所有尝试都失败了,因为 event_data("plotly_click")
仍然是它的旧值。
有人能帮忙吗?
[编辑:该问题已在 Plotly 4.9.0 中修复。查看答案 .clientValue-
from the source code or use
我终于解决了这个问题。我知道这会困扰一些人,所以我会 post 在这里提出我的解决方案:
基本上我使用 shinyjs
包来重置关于某个事件(在我的例子中是一个按钮)的最后一次点击(event_data("plotly_click")
从中获取信息的来源)的数据。
函数的定义是(注意"A"如果使用需要换成plotly-source字符串):
extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('.clientValue-plotly_click-A', 'null'); }")
然后在 js$resetClick()
单击按钮时调用它。
最小示例:
library(shiny)
library(plotly)
library(shinyjs)
ui <- shinyUI(
fluidPage(
useShinyjs(),
# code to reset plotlys event_data("plotly_click", source="A") to NULL -> executed upon action button click
# note that "A" needs to be replaced with plotly source string if used
extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('.clientValue-plotly_click-A', 'null'); }"),
actionButton("reset", "Reset plotly click value"),
plotlyOutput("plot"),
verbatimTextOutput("clickevent")
)
)
server <- shinyServer(function(input, output) {
output$plot <- renderPlotly({
plot_ly(mtcars, x=~cyl, y=~mpg)
})
output$clickevent <- renderPrint({
event_data("plotly_click")
})
observeEvent(input$reset, {
js$resetClick()
})
})
shinyApp(ui, server)
我遇到了同样的问题,并提出了一个解决方案,我将 plotly 对象的 source 参数指定为 reactive value如下:
在 plot_ly(data,x,y,...,source = x)
和 event_data(...,source = x)
中,让 x
成为 reactiveValues
对象的一个元素。当您的事件触发时,更改 x 的值(增量或散列),这会实例化一个新的 event_data()
对象。
工作得很好。
问题终于在 Plotly 方面得到解决:https://github.com/ropensci/plotly/issues/1043
event_data("plotly_click", priority = "event")
每次点击都会更新,而不仅仅是闪亮的输入更改(和以前一样)。从 Plotly 4.9.0 开始工作。
使用 Plotly 4.9.0 的最小示例:
library(shiny)
library(plotly)
ui <- shinyUI(
fluidPage(
plotlyOutput("plot", height = 200),
verbatimTextOutput("time_last_click")
)
)
server <- shinyServer(function(input, output) {
output$plot <- renderPlotly({
plot_ly(mtcars[1,], x=~cyl, y=~mpg, size = 1)
})
output$time_last_click <- renderPrint({
tmp <- event_data("plotly_click", priority = "event")
Sys.time()
})
})
shinyApp(ui, server)