Shiny: Как определить, какие аккордеонные элементы выбраны? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть R Shiny, где server.R выводит большое количество динамически генерируемых объектов пользовательского интерфейса.

Вместо обработки сотен объектов в input для обработки, я подумал, что мог бы использовать bs_accordion() из пакета bsplus .

Я ожидал, что bs_accordion() сообщит о состоянии элементов, которыми он управляет, обратно server.R через объект input.

Мой план состоял в том, чтобы динамически генерировать элементы пользовательского интерфейса только для выбранного в данный момент элемента, используя renderUI().

К сожалению, насколько я могу судить, ничего в пакете bsplus ничего не помещаетв input.

Следующее работает в консоли браузера (предположим, что элемент accordion равен MYACCORDION) ...

MYACCORDION.onclick=function(){
Shiny.onInputChange('SELECTED_DIV',document.getElementsByClassName('in')[0].getElementsByClassName('shiny-input-container')[0].id
}

... in, очевидно, класс bs дает элементна данный момент выбрана в гармошке и всегда есть только одна.Поэтому после этого input$SELECTED_DIV обновляется всякий раз, когда выбирается что-то новое.

Но я не могу сделать это программно.Я попытался поместить его в tags$script(...) в конце fluidPage(), и он не привязывается к div.Я также попытался вставить его через div(...,onclick=FOO), но значение onclick экранируется и выводится и не интерпретируется как текст.

  • Где находится правильное место для вставки onclick функций вui.R?
  • В качестве альтернативы, как заставить значение атрибута onclick обрабатываться как есть без экранирования символов?
  • Или уже есть пакет для Shiny для присоединенияJavascript функционирует для onclick событий?

Спасибо.

1 Ответ

0 голосов
/ 06 декабря 2018

Я бы предложил установить фиктивный ввод, который будет содержать текущее значение (или в данном случае текст) выбранной вкладки.

Это может помочь вам:

library(shiny)
library(bsplus)

shinyApp(
  ui = fluidPage(
    tags$script("$(function() {
                  $('#meet_the_beatles a').on('click', function(x) {
                    Shiny.onInputChange('selected_tab', x.target.innerText)
                  });
                });"),

    fluidRow(
      column(
        width = 6,
        offset = 3,
        bs_accordion(id = "meet_the_beatles") %>%
          bs_append(title = "John", content = "Rhythm guitar, vocals") %>%
          bs_append(title = "Paul", content = "Bass guitar, vocals") %>%
          bs_append(title = "George", content = "Lead guitar, vocals") %>%
          bs_append(title = "Ringo", content = "Drums, vocals")
      )
    ),

    HTML("<input id='selected_tab' type='text' style='display: none;'")
  ),

  server = function(input, output, session) {
    observe({
      print(paste("The selected tab is", input$selected_tab))
    })
  }
)
...