Как узнать информацию о нажатой панели в столбце старшей диаграммы r блестящий график
Я хочу обнаружить некоторую информацию, когда пользователь щелкает по столбцу графика верхнего столбца. Мне нужно знать имя и категорию панели, на которую нажимали, если имя было выбрано в легенде или был нажат фон. Часть с названием в порядке, но я не могу определить, какой код 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
})
}
Новые вопросы Когда я нажимаю, чтобы отключить и сразу после включения столбца, я не могу обнаружить второе событие. Как я могу определить, был ли столбец или легенда отключены и включены (или наоборот) без каких-либо других событий в середине?
Другой вопрос: можно ли обнаружить щелчок на фоне сюжета?
Спасибо
1 ответ
Возможно, на этот раз я расскажу подробнее о том, что вы можете сделать и какие у вас есть возможности:
highchart
функция события всегда имеет вид JS("function(event) { ... }")
, JS
обозначает JavaScript и не позволяет R интерпретировать код внутри. К счастью, JavaScript очень похож на R, что облегчит написание операторов, даже если вы не знаете JavaScript.
Функция внутри всегда должна иметь event
параметр. От highcharts
документация, это событие имеет несколько свойств, наиболее важные из всех, point
, Свойства в JavaScript могут быть доступны через точку .
так же, как вы бы использовали $
в Р. Так event.point
будет точка, на которую вы нажали.
Теперь эта точка также имеет множество свойств, большинство из которых не очень полезны. Но возможные значения, которые вы можете использовать: category
, color
, x
а также 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)