删除绘图点击事件数据

时间:2017-03-24 09:54:59

标签: r shiny plotly

我正在设计一个包含plotly散点图的Shiny应用程序。我希望用户能够使用event_data功能单击图表来记录事件,但是能够通过点击actionButton清除该事件。下面是一些示例代码:

library(shiny)
library(plotly)

ui <- fluidPage(
  actionButton("clearEvent", label = "clear event"),
  verbatimTextOutput("plotVal"),
  plotlyOutput('plot1')
)

server <- function(input, output, session) {
  output$plot1 <- renderPlotly({
    d <- diamonds[sample(nrow(diamonds), 1000), ]
    plot_ly(d, x = ~carat, y = ~price, color = ~carat,
            size = ~carat, text = ~paste("Clarity: ", clarity))
  })

  output$plotVal <- renderPrint({
    e <- event_data("plotly_click")
    if (is.null(e)) {
      NULL
    } else {
      e
    }
  })

  observeEvent(input[["clearEvent"]], {
    e <- NULL
  })
}

shinyApp(ui = ui, server = server)

然而,这并不像我期望的那样清除事件。查看event_data的代码表明这可能是因为它存储在session对象本身中。我有什么想法可以覆盖它吗?

我遇到的唯一类似的事情是Clear plotly click event,但它非常hacky,似乎对我不起作用。

2 个答案:

答案 0 :(得分:3)

在您的示例中,e仅在renderPrintobserveEvent中定义,而不是全局定义,即使在e中更改observeEvent也是如此,它不会触发renderPrint中的任何内容。

您可以使用reactiveValues

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都会更改,并且因为data$e中的renderPrint存在依赖关系,只要data$esource_transaction,就会更新改变。

答案 1 :(得分:3)

上一个答案部分解决了问题,但是,用户无法再次点击同一个标记标记,至少不会触发更新。通过event_data("plotly_click")手动重置shinyjs的来源,可以解决该问题:

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)