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

hsi*_*lva 4 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        
  })
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

K. *_*hde 15

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

一个highchart事件函数总是有形式JS("function(event) { ... }").该JS和代表JavaScript防止ř从内部解释的代码.幸运的是,JavaScript看起来很像R,即使你不知道任何JavaScript,它也会更容易编写语句.

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

现在,这一点也有很多属性,其中大多数都不是很有用.但是,你可能想使用可能的值是category,color,xy为各自的轴值.因此,如果您想知道点击点的y值,event.point.y那么命令就是.另一个例子:在你的情况下,event.point.x会产生一个x值,在条形图的情况下不是category,但是索引category(这里的计数从0开始).在前面的示例(您的代码片段)中,我也使用了该对象this.this代表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) 
Run Code Online (Sandbox Code Playgroud)