清晰的点击事件

时间:2016-10-04 17:52:02

标签: r plotly

我正试图在闪亮的应用程序环境中使用情节点击事件。关注the official demo我正在使用这段代码更新日期选择器并点击我的应用中的另一个标签:

observe({
  d <- event_data("plotly_click", source = 'plot')
  if(!is.null(d) & (input$navPanel == 'overview')) {

    d %>% filter(curveNumber == 0) %>% select(x) -> selected_date

    updateDateInput(session, "date", value = lubridate::ymd(selected_date$x))
    updateTabsetPanel(session, "navPanel", selected = "details")
  }

但是,当我尝试从details切换回overview标签时,我会立即返回details标签。我假设发生这种情况是因为事件永远不会被清除,即当标签发生变化时d不是null,因此if - 子句中的条件评估为{{1 }}

那么,如何以编程方式清除click事件?将<{1}}添加到条件的末尾似乎不会这样做。

2 个答案:

答案 0 :(得分:3)

我遇到同样的问题,我发现的解决方法是将旧状态存储在全局变量中,并仅在该变量发生更改时才更新,而不是!is.null()

selected_date <- 0 # declare outside the server function

server <- function(input, output, session) {
  observe({
    d <- event_data("plotly_click")
    new_value <- ifelse(is.null(d),"0",d$x) # 0 if no selection
    if(selected_date!=new_value) {
      selected_date <<- new_value 
      if(selected_date !=0 && input$navPanel == 'overview')
        updateDateInput(session, "date", value = lubridate::ymd(selected_date))
    }
  })
...
}

这也允许您在取消选择元素时添加行为

答案 1 :(得分:2)

我使用shinyjs解决了这个问题,并在event_data("plotly_click")函数的帮助下手动重置Shiny.onInputChange,该函数手动设置input向量中的值:

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)