这次我可能会更详细地介绍你可以做什么以及你有什么可能性:
highchart 事件函数始终具有JS("function(event) { ... }") 的形式。 JS 代表 JavaScript 并阻止 R 解释其中的代码。幸运的是,JavaScript 看起来很像 R,即使您不懂任何 JavaScript,也可以更轻松地编写语句。
内部的函数总是必须有一个event 参数。在highcharts 文档中,这个事件有几个属性,最重要的是point。 JavaScript 中的属性可以通过点. 访问,就像您在R 中使用$ 一样。所以event.point 将是您单击的点。
现在,这个点也有很多属性,其中大部分都不是很有用。但您可能想要使用的可能值是 category、color、x 和 y 用于各自的轴值。所以如果你想知道点击点的y值,event.point.y就是命令。另一个例子:在您的情况下,event.point.x 将产生x 值,在条形图的情况下不是category,而是category 的索引(这里从0 开始计数)。在前面的示例(您的代码 sn-p)中,我还使用了对象 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)