当我点击禁用并立即启用列时,我无法检测到第二个事件。如何检测列或图例是否已禁用和启用(反之亦然),中间没有任何其他不同的事件?
其他问题是:可以检测情节背景上的点击吗?
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_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 = 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], ".")
})
答案 0 :(得分:2)
使用Shiny的点击事件时,有时需要再次发出相同值的相同事件。是Shiny固有的,只有值的变化才会被警告,而反应只会对变化作出反应。 对此的一个简单修复是不仅要发送您需要的值,还要发送随机数或当前时间。每次都会改变的东西。
因此,当您多次单击同一系列时,您的图例点击的可能性是将JS功能更改为
Shiny.onInputChange('legendClick', [this.name, Math.random()]);
此外,在代码中使用input$legendClick[1]
来访问系列名称。
但是,在您的情况下,您还希望获得图例项的状态。这当然是从点击到点击的变化。因此,如果我们使用名称发送,输入值将始终更改。所以上面不需要这个一般的建议。图例状态存储在event
下的event.target.visible
中。在那里,您可以看到点击的系列在点击时的可见性状态。这意味着在获得click事件后,您的可见性与其相反。
以下代码:
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, event.target.visible]);}")
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 = 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, {
# Visibility of target. When deselecting, the target was visible at the moment of click.
seriesStatus <- switch(input$legendClicked[2], "FALSE" = "visible", "TRUE" = "invisible")
outputText <<- paste0("You clicked into the legend and selected series ", input$legendClicked[1], " and this Series is now ", seriesStatus, ".")
})
output$text <- renderText({
outputText
})
}
shinyApp(ui, server)
另一件事可能会帮助您了解您可以做的其他事情,那就是查看JavaScript控制台。运行Shiny应用程序时,右键单击显示窗口,按Inspect
打开RStudio检查器。在那里,其中一个乘客是Console
,您可以在其中获得所有客户端错误/警告消息。现在,一个有用的JavaScript命令是console.log
,它打印到这个特定的控制台。因此,在某些单击函数中,尝试添加命令console.log(event);
并在下一个Shiny应用程序启动时打开JavaScript控制台。可以完全检出事件,以查看点击事件的哪些部分可能有用。 (我从那里搜索获得了可见性属性。)
第二个更广泛的问题:整个图表都有一个点击事件,可以添加到R中的hc_chart
函数中。就像其他点击事件一样。可以找到更多信息here。