代码之家  ›  专栏  ›  技术社区  ›  MLavoie

R ShinyJS ShinyDashboard Box Uncollapse on RadionButtons输入

  •  0
  • MLavoie  · 技术社区  · 6 年前

    基于这个问题 R shinyjs shinydashboard box uncollapse on action button input 和问题 How to manually collapse a box in shiny dashboard ,我想用 actionButton radioButtons (或) selectInput )下面是一个可重复的例子。单击“是”时,我希望框id=b2和id=b3折叠,单击“否”时,框id=b1和id=b3折叠,单击“可能”时,框id=b1和id=b2折叠。有了下面的代码,就有了一个折叠,但它不能按预期工作。

    library(shiny)
    library(shinyBS)
    library(dplyr)
    library(shinydashboard)
    
    
    # javascript code to collapse box
    jscode <- "
    shinyjs.collapse = function(boxid) {
    $('#' + boxid).closest('.box').find('[data-widget=collapse]').click();
    }
    "
    
    #Design sidebar
    sidebar <- dashboardSidebar(width = 225, collapsed=F, 
                                sidebarMenu(id="tabs",
                                            menuItem("zz", tabName = "zz", selected=TRUE)))
    
    #Design body 
    body <- dashboardBody(shinyjs:::useShinyjs(), 
                          shinyjs:::extendShinyjs(text = jscode),
                          tabItems(
                            tabItem(tabName = "zz", 
                                    fluidRow(box(radioButtons('go','Go', choices = c("yes", "no", "maybe"))),
                                             box(id="B1", collapsible=T,  status = "primary", color="blue", solidHeader = T, 
                                                 title="Test"),
                                             box(id="B2", collapsible=T,  status = "primary", color="blue", solidHeader = T, 
                                                 title="Test2"),
                                             box(id="B3", collapsible=T,  status = "primary", color="blue", solidHeader = T, 
                                                 title="Test3")
    
                                             ))
                            ))
    
    Header <- dashboardHeader()
    
    #Show title and the page (includes sidebar and body)
    ui <- dashboardPage(Header, sidebar, body)
    
    
    server <- shinyServer(function(input, output, session){
    
      observeEvent(input$go == "yes",
    
                   {js$collapse("B2", "B3")}
    
      )
      #
      observeEvent(input$go == "no",
    
                   {js$collapse("B1", "B3")}
      )
    
      observeEvent(input$go == "maybe",
    
                   {js$collapse("B1", "B2")}
      )
    
    })
    
    shinyApp( ui = ui, server = server)
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Wilmar van Ommeren    6 年前

    您提供的折叠函数实际上是切换框,而不是只折叠它们。因此,在应用此函数之前,首先必须检查是否已经折叠了一个框。这可以通过以下功能实现: How to see if a shiny dashboard box is collapsed from the server side .

    如果还想打开剩余的框,可以使用相同的功能。

    此外,您可以将所有内容放在一个观察者中,以使代码更加一致。

    工作示例:

    library(shiny)
    library(shinyBS)
    library(dplyr)
    library(shinydashboard)
    library(shinyjs)
    
    # javascript code to collapse box
    jscode <- "
    shinyjs.collapse = function(boxid) {
    $('#' + boxid).closest('.box').find('[data-widget=collapse]').click();
    }
    "
    
    collapseInput <- function(inputId, boxId) {
      tags$script(
        sprintf(
          "$('#%s').closest('.box').on('hidden.bs.collapse', function () {Shiny.onInputChange('%s', true);})",
          boxId, inputId
        ),
        sprintf(
          "$('#%s').closest('.box').on('shown.bs.collapse', function () {Shiny.onInputChange('%s', false);})",
          boxId, inputId
        )
      )
    }
    
    #Design sidebar
    sidebar <- dashboardSidebar(width = 225, collapsed=F, 
                                sidebarMenu(id="tabs",
                                            menuItem("zz", tabName = "zz", selected=TRUE)))
    
    #Design body 
    body <- dashboardBody(shinyjs:::useShinyjs(), 
                          shinyjs:::extendShinyjs(text = jscode),
                          tabItems(
                            tabItem(tabName = "zz", 
                                    fluidRow(box(radioButtons('go','Go', choices = c("yes", "no", "maybe"))),
                                             box(id="B1", collapsible=T,  status = "primary", color="blue", solidHeader = T, 
                                                 title="Test"),
                                             collapseInput(inputId = "iscollapsebox1", boxId = "B1"),
                                             box(id="B2", collapsible=T,  status = "primary", color="blue", solidHeader = T, 
                                                 title="Test2"),
                                             collapseInput(inputId = "iscollapsebox2", boxId = "B2"),
                                             box(id="B3", collapsible=T,  status = "primary", color="blue", solidHeader = T, 
                                                 title="Test3"),
                                             collapseInput(inputId = "iscollapsebox3", boxId = "B3")
                                    ))
                          ))
    
    Header <- dashboardHeader()
    
    #Show title and the page (includes sidebar and body)
    ui <- dashboardPage(Header, sidebar, body)
    
    server <- shinyServer(function(input, output, session){
      observeEvent(input$go,{
        box1_collapsed = F
        box2_collapsed = F
        box3_collapsed = F
        if (!is.null(input$iscollapsebox1)){
          box1_collapsed <- input$iscollapsebox1
        }
        if (!is.null(input$iscollapsebox2)){
          box2_collapsed <- input$iscollapsebox2
        }
        if (!is.null(input$iscollapsebox3)){
          box3_collapsed <- input$iscollapsebox3
        }
        if (input$go == 'yes'){
          if (!box2_collapsed){
            js$collapse("B2")}
          if (!box3_collapsed){
            js$collapse("B3")}
          # if you want to open B1
          if (box1_collapsed){
            js$collapse("B1")}
        } else if (input$go == 'no'){
          if (!box1_collapsed){
            js$collapse("B1")}
          if (!box3_collapsed){
            js$collapse("B3")}
          # if you want to open B2
          if (box2_collapsed){
            js$collapse("B2")}
        } else if (input$go == 'maybe'){
          if (!box1_collapsed){
            js$collapse("B1")}
          if (!box2_collapsed){
            js$collapse("B2")}
          # if you want to open B3
          if (box3_collapsed){
            js$collapse("B3")}
        }
      })
    })
    
    shinyApp( ui = ui, server = server)