在用户点击散点图中的标记后,我正在使用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")
仍保留旧值。
有人可以帮忙吗?
答案 0 :(得分:4)
我终于解决了这个问题。我知道这困扰了一些人,所以我会在这里发布我的解决方案:
基本上我使用shinyjs
包重置有关最后一次点击的数据(event_data("plotly_click")
获取其信息的来源)对某个事件(在我的情况下是一个按钮)。
函数的定义是(注意&#34; A&#34;如果使用的话,需要用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)
答案 1 :(得分:0)
我遇到了同样的问题,并提出了一个解决方案,我将plotly对象的 source 参数指定为无效值,如下所示:
在plot_ly(data,x,y,...,source = x)
和event_data(...,source = x)
中,x
成为reactiveValues
对象的元素。当您的事件触发时,更改x(增量或散列)的值,该值实例化新的event_data()
对象。
像魅力一样工作。
答案 2 :(得分:0)
问题终于在Plotly方面得到解决:https://github.com/ropensci/plotly/issues/1043
使用event_data("plotly_click", priority = "event")
解决了此问题,并且今天需要为此开发版本的plotly(当前为4.8.0.9000)。