Removing plotly click event data

前端 未结 2 1815
天命终不由人
天命终不由人 2020-12-20 17:09

I am designing a Shiny app which contains a plotly scatter plot. I would like for the user to be able to click on the graph to record an event using the e

相关标签:
2条回答
  • 2020-12-20 17:58

    The previous answer partially solves the problem, however, the user cannot click on the same plotly marker again, at least no update is triggered. That problem can be tackled by manually resetting the source of event_data("plotly_click") withshinyjs:

    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)
    
    0 讨论(0)
  • 2020-12-20 18:08

    In your example, e is just defined in the renderPrint and in the observeEvent and not globally so even if e is changed in the observeEvent, it does not trigger anything in the renderPrint.

    You can use reactiveValues for this:

    data <- reactiveValues(e=NULL)
    
      observe({
        data$e <- event_data("plotly_click")
      })
    
      output$plotVal <- renderPrint({
        e <- data$e
        if (is.null(e)) {
          NULL
        } else {
          e
        }
      })
    
      observeEvent(input[["clearEvent"]], {
        data$e <- NULL
      })
    

    data$e is changed whenever the user click the plot or the button, and since there is a dependency on data$e in the renderPrint, that gets updated whenever data$e is changed.

    0 讨论(0)
提交回复
热议问题