我正试图在闪亮的应用程序环境中使用情节点击事件。关注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}}添加到条件的末尾似乎不会这样做。
答案 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)