如何在高图列r闪亮图中的条中检测多个cliks

时间:2016-05-16 14:18:23

标签: javascript jquery r highcharts shiny

当我点击禁用并立即启用列时,我无法检测到第二个事件。如何检测列或图例是否已禁用和启用(反之亦然),中间没有任何其他不同的事件?

其他问题是:可以检测情节背景上的点击吗?

library("shiny")
library("highcharter")

ui <- shinyUI(
  fluidPage(
    column(width = 8, highchartOutput("hcontainer", height = "500px")),
    column(width = 4, textOutput("text"))
  )
)

server <- function(input, output) {      

  a <- data.frame(b = LETTERS[1:10], c = 11:20, d = 21:30, e = 31:40)

  output$hcontainer <- renderHighchart({      

    canvasClickFunction <- JS("function(event) {Shiny.onInputChange('canvasClicked', [this.name, event.point.category]);}")
    legendClickFunction <- JS("function(event) {Shiny.onInputChange('legendClicked', this.name);}")

    highchart() %>% 
      hc_xAxis(categories = a$b) %>% 
      hc_add_serie(name = "c", data = a$c) %>%
      hc_add_serie(name = "d", data = a$d) %>% 
      hc_add_serie(name = "e", data = a$e) %>%
      hc_plotOptions(series = list(stacking = FALSE, events = list(click = canvasClickFunction, legendItemClick = legendClickFunction))) %>%
      hc_chart(type = "column")

  })      

  makeReactiveBinding("outputText")

  observeEvent(input$canvasClicked, {
    outputText <<- paste0("You clicked on series ", input$canvasClicked[1], " and the bar you clicked was from category ", input$canvasClicked[2], ".") 
  })

1 个答案:

答案 0 :(得分:2)

使用Shiny的点击事件时,有时需要再次发出相同值的相同事件。是Shiny固有的,只有值的变化才会被警告,而反应只会对变化作出反应。 对此的一个简单修复是不仅要发送您需要的值,还要发送随机数或当前时间。每次都会改变的东西。

因此,当您多次单击同一系列时,您的图例点击的可能性是将JS功能更改为

Shiny.onInputChange('legendClick', [this.name, Math.random()]);

此外,在代码中使用input$legendClick[1]来访问系列名称。

但是,在您的情况下,您还希望获得图例项的状态。这当然是从点击到点击的变化。因此,如果我们使用名称发送,输入值将始终更改。所以上面不需要这个一般的建议。图例状态存储在event下的event.target.visible中。在那里,您可以看到点击的系列在点击时的可见性状态。这意味着在获得click事件后,您的可见性与其相反。

以下代码:

library("shiny")
library("highcharter")

ui <- shinyUI(
  fluidPage(
    column(width = 8, highchartOutput("hcontainer", height = "500px")),
    column(width = 4, textOutput("text"))
  )
)

server <- function(input, output) {      

  a <- data.frame(b = LETTERS[1:10], c = 11:20, d = 21:30, e = 31:40)

  output$hcontainer <- renderHighchart({      

    canvasClickFunction <- JS("function(event) {Shiny.onInputChange('canvasClicked', [this.name, event.point.category]);}")
    legendClickFunction <- JS("function(event) {Shiny.onInputChange('legendClicked', [this.name, event.target.visible]);}")

    highchart() %>% 
      hc_xAxis(categories = a$b) %>% 
      hc_add_serie(name = "c", data = a$c) %>%
      hc_add_serie(name = "d", data = a$d) %>% 
      hc_add_serie(name = "e", data = a$e) %>%
      hc_plotOptions(series = list(stacking = FALSE, events = list(click = canvasClickFunction, legendItemClick = legendClickFunction))) %>%
      hc_chart(type = "column")

  })      

  makeReactiveBinding("outputText")

  observeEvent(input$canvasClicked, {
    outputText <<- paste0("You clicked on series ", input$canvasClicked[1], " and the bar you clicked was from category ", input$canvasClicked[2], ".") 
  })

  observeEvent(input$legendClicked, {
    # Visibility of target. When deselecting, the target was visible at the moment of click.
    seriesStatus <- switch(input$legendClicked[2], "FALSE" = "visible", "TRUE" = "invisible")
    outputText <<- paste0("You clicked into the legend and selected series ", input$legendClicked[1], " and this Series is now ", seriesStatus, ".")
  })

  output$text <- renderText({
    outputText      
  })
}

shinyApp(ui, server) 

另一件事可能会帮助您了解您可以做的其他事情,那就是查看JavaScript控制台。运行Shiny应用程序时,右键单击显示窗口,按Inspect打开RStudio检查器。在那里,其中一个乘客是Console,您可以在其中获得所有客户端错误/警告消息。现在,一个有用的JavaScript命令是console.log,它打印到这个特定的控制台。因此,在某些单击函数中,尝试添加命令console.log(event);并在下一个Shiny应用程序启动时打开JavaScript控制台。可以完全检出事件,以查看点击事件的哪些部分可能有用。 (我从那里搜索获得了可见性属性。)

第二个更广泛的问题:整个图表都有一个点击事件,可以添加到R中的hc_chart函数中。就像其他点击事件一样。可以找到更多信息here