我想在用户点击列高清图的栏中时检测到一些信息。如果在图例中选择了名称或者单击了背景,我需要知道所单击栏的名称和类别。名称部分没问题,但是我无法发现哪些是我必须编写的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
})
}
新问题 当我单击禁用并立即启用列时,我无法检测到第二个事件。 如何检测列或图例是否已禁用和启用(反之亦然),中间没有任何其他不同的事件?
其他问题是:可以检测情节背景上的点击吗?
由于
答案 0 :(得分:12)
这次我可能会详细介绍你可以做什么以及你有什么可能性:
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开始)。在前面的示例(您的代码段)中,我还使用了对象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)