Конфликт между глянцевым BBS :: bsCollapse и блестящим :: условным панелем - PullRequest
1 голос
/ 19 сентября 2019

Я использую shiny::conditionalPanel внутри shinyBS::bsCollapsePanel.У меня есть логика в моем приложении, которая зависит от того, какая панель блестящаяBS активна (то есть развернута).Это работает нормально, пока я не активирую условную панель.Если я покажу условную панель «Блестящий», то панель свертыванияinyBS застрянет как активная, даже когда панель неактивна (т.е. закрыта).

Как я могу изменить свой код, чтобы складные панели регистрировались как активные только в том случае, если они развернуты?

В этом примере есть текстовый вывод, указывающий активную панель.Переключение между панелями работает правильно, если не отображаются условные панели.

РЕДАКТИРОВАТЬ: Похоже, эта ошибка уже может быть задокументирована (https://github.com/ebailey78/shinyBS/issues/38) и существует возможное решение (https://github.com/ebailey78/shinyBS/pull/68/commits).

library(shiny)
library(shinyBS)

# Define UI logic
ui <- fluidPage(

    htmlOutput("activePanel"),

    shinyBS::bsCollapse(
        id = "bsPanels",
        shinyBS::bsCollapsePanel(
            "Panel A",
            value = "panelA",
            checkboxInput("showPanelA",
                          "Show panel",
                          value = FALSE),
            conditionalPanel(
                condition = "input.showPanelA",
                helpText("Panel A conditional content")
            ),
            helpText("Panel A main content")
        ),
        shinyBS::bsCollapsePanel(
            "Panel B",
            value = "panelB",
            checkboxInput("showPanelB",
                          "Show panel",
                          value = FALSE),
            conditionalPanel(
                condition = "input.showPanelB",
                helpText("Panel B conditional content")
            ),
            helpText("Panel B main content")
        )
    )
)

# Define server logic 
server <- function(input, output) {

    output$activePanel <- renderText({
        paste("<b>Active Panel:</b>", paste(input$bsPanels, collapse = ", "))
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 19 сентября 2019

Об этой проблеме обсуждается на странице проекта блестящей (https://github.com/ebailey78/shinyBS/issues/38).. Однако у меня был ограниченный успех с предлагаемыми решениями.

Лучшее решение, которое я нашел, - это использовать shinyjs::showElement и shinyjs::hideElement.

library(shiny)
library(shinyBS)
library(shinyjs)

# Define UI logic
ui <- fluidPage(

    useShinyjs(),

    htmlOutput("activePanel"),

    shinyBS::bsCollapse(
        id = "bsPanels",
        shinyBS::bsCollapsePanel(
            "Panel A",
            value = "panelA",
            checkboxInput("showPanelA",
                          "Show panel",
                          value = FALSE),
            uiOutput("condPanelA"),
            helpText("Panel A main content")
        ),
        shinyBS::bsCollapsePanel(
            "Panel B",
            value = "panelB",
            checkboxInput("showPanelB",
                          "Show panel",
                          value = FALSE),
            uiOutput("condPanelB"),
            helpText("Panel B main content")
        )
    )
)

# Define server logic 
server <- function(input, output) {

    output$activePanel <- renderText({
        paste("<b>Active Panel:</b>", paste(input$bsPanels, collapse = ", "))
    })

    # Logic for conditional panels
    output$condPanelA <- renderUI({
      helpText("Panel A conditional content")
    })
    observe({
      if(input$showPanelA) {
        show("condPanelA")
      } else {
        hide("condPanelA")
      }
    })
    output$condPanelB <- renderUI({
      helpText("Panel B conditional content")
    })
    observe({
      if(input$showPanelB) {
        show("condPanelB")
      } else {
        hide("condPanelB")
      }
    })

}

# Run the application 
shinyApp(ui = ui, server = server)


...