Двойной щелчок по одному и тому же сюжетному маркеру не запускает события дважды

Я использую event_data("plotly_click") Plotly, чтобы делать вещи (открывая модальное окно) после того, как пользователь щелкнул маркер на точечной диаграмме. После этого (например, при закрытии модального окна) 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)

Я пробовал обходные пути с помощью onclick отshinjs, но безрезультатно (он хорошо работает в пустых областях графика, но не при нажатии на маркеры):

shinyjs::onclick(id="plot", print("clicked"))

Я также пытался использовать реактивное значение, которое сохраняет последний щелчок и сразу после этого сбрасывается (например, с помощью event_data("plotly_hover")), но все попытки терпят неудачу, потому что event_data("plotly_click") остается в своем старом значении.

Кто-нибудь может помочь?


person shosaco    schedule 07.06.2017    source источник
comment
Я думаю, что это известная проблема community.plot.ly/t/reseting-click -события/2718   -  person Pork Chop    schedule 07.06.2017
comment
спасибо, но это всего лишь ссылка на одинокий вопрос на их форуме, никаких следов отслеживаемой проблемы или чего-то подобного :)   -  person shosaco    schedule 11.06.2017


Ответы (3)


[Изменить: проблема была исправлена ​​в Plotly 4.9.0. См. ответ ниже. Этот ответ работает до Plotly 4.8.0. Начиная с plotly 4.9.0., удалите строку .clientValue- из исходного кода или используйте ответ ниже.]

Я наконец решил эту проблему. Я знаю, что это беспокоит некоторых людей, поэтому я опубликую свое решение здесь:

В основном я использую пакет shinyjs для сброса данных о последнем клике (источник, откуда event_data("plotly_click") получает информацию) по определенному событию (кнопка в моем случае).

Определение функции (обратите внимание, что «A» необходимо заменить строкой сюжетного источника, если она используется):

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)

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

person shosaco    schedule 14.06.2017
comment
Привет @shosaco. Я скопировал именно этот пример, и щелчок не сбрасывается. Я использую R 3.6.0, и мой sessionInfo() выглядит следующим образом: [1] shinyjs_1.0 plotly_4.9.0 ggplot2_3.1.1 shiny_1.3.2 . Есть ли проблема с новой библиотекой plotly? Я также использовал изменение priority = "event", как показано ниже, но javascript все еще не сбрасывается. - person Agrosel; 26.06.2019
comment
Уважаемый @Agrosel, спасибо за замечание! В 4.9.0 они изменили имя ввода. Для 4.8.0 работает приведенный выше пример, для Plotly 4.9.0 необходимо использовать строку extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('plotly_click-A', 'null'); }"),. - person shosaco; 26.06.2019

Наконец-то проблема была исправлена ​​на стороне 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)

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

person shosaco    schedule 18.02.2019

У меня была та же проблема, и я нашел решение, в котором я указал аргумент source объекта plotly как реактивное значение следующим образом:

В plot_ly(data,x,y,...,source = x) и event_data(...,source = x) пусть x будет элементом объекта reactiveValues. Когда ваше событие срабатывает, измените значение x (приращение или хэш), которое создает экземпляр нового объекта event_data().

Работал как шарм.

person Peter W.    schedule 09.01.2018
comment
Попробуйте обновить свой ответ, чтобы использовать `для форматирования части кода вашего ответа. Это поможет с читабельностью. В правой части экрана редактирования вы увидите советы по форматированию. - person Bek; 10.01.2018