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,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)
Run Code Online (Sandbox Code Playgroud)