如何在高亮度列r闪亮情节中了解有关单击条的信息

时间:2016-05-13 11:32:09

标签: javascript jquery r highcharts shiny

我想在用户点击列高清图的栏中时检测到一些信息。如果在图例中选择了名称或者单击了背景,我需要知道所单击栏的名称和类别。名称部分没问题,但是我无法发现哪些是我必须编写的JS代码才能知道这类信息。

非常感谢

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({      

    myClickFunc <- JS("function(event) {Shiny.onInputChange('hcClicked', 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 = myClickFunc))) %>%
      hc_chart(type = "column")

  })      

  output$text <- renderText({
    input$hcClicked        
  })
}

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

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

由于

1 个答案:

答案 0 :(得分:12)

这次我可能会详细介绍你可以做什么以及你有什么可能性:

highchart事件函数的格式始终为JS("function(event) { ... }")JS代表JavaScript并阻止R解释其中的代码。幸运的是,JavaScript看起来很像R,即使你不知道任何JavaScript,它也会更容易编写语句。

里面的函数总是必须有event参数。在highcharts文档中,此事件包含多个属性,最重要的是point。 JavaScript中的属性可以通过点.访问,就像在R中使用$一样。因此event.point将是您点击的点。

现在,这一点也有很多属性,其中大多数都不是很有用。但您可能想要使用的值包括categorycolorxy各自的轴值。因此,如果您想知道点击点的y值,event.point.y就是命令。另一个例子:在您的情况下,event.point.x会产生x值,如果条形图不是category,而是category的索引(计数从0开始)。在前面的示例(您的代码段)中,我还使用了对象thisthis代表已点击的series。这只是一个快捷方式,因为您还可以通过event.point.series获取该系列。该系列本身具有很多属性,例如name

关于JavaScript的注意事项:JavaScript中的列表(数组)是使用[ ... ]括号创建的。我在下面的代码中使用它来在一个命令中发送多个值。

这是第一部分。现在,您希望将选择内容传达给您的闪亮应用。为此,Shiny有内置的信息渠道。一个是JavaScript函数Shiny.onInputChange。此函数有两个参数,第二个是您要发送的值。第一个是名称,您希望以后在该名称下访问该值。所以用法总是Shiny.onInputChange('myVar', value)。现在,此值将发送到您的服务器,并可在input$myVar下访问。在那里,您具有与任何其他输入相同的规则。您可以将input$myVar置于被动环境中,只要有新内容发送到input$myVar,他们就会做出反应。

关于您的直接请求:要了解所点击的值属于哪个类别,可以通过稍微更改初始点击功能来实现。 (我将这些功能重命名为适合他们的功能。)上面的解释应该让它变得可以理解。第二个功能(使用图例点击)使用另一个内置于highcharts的事件“插槽”。 legendItemClick的工作方式与普通click的工作方式相同,但只能监听图例点击次数。还有一些可以分配的事件处理程序,例如mouseOver,如果您需要悬停事件。

好的,现在这里有一个示例代码,为我上面写的内容提供了一个工作示例:

祝你好运

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_series(name = "c", data = a$c) %>%
      hc_add_series(name = "d", data = a$d) %>% 
      hc_add_series(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, {
    outputText <<- paste0("You clicked into the legend and selected series ", input$legendClicked, ".")
  })

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

shinyApp(ui, server)