【问题标题】:shinydashboard sidebar unable to uncollapse multiple tabsshinydashboard 侧边栏无法展开多个选项卡
【发布时间】:2016-10-07 15:54:43
【问题描述】:

我有一些很简单的shinydashboard代码:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(id='tab1',
      menuItem('tab 1', tabName='tab1',
        menuSubItem('subtab 1', tabName='tab1subtab1'),
        menuSubItem('subtab 2', tabName='tab1subtab2')
      ),
      menuItem('tab 2', tabName='tab2',
        menuSubItem('subtab 1', tabName='tab2subtab1'),
        menuSubItem('subtab 2', tabName='tab2subtab2')
      )
    ),
    tags$head(tags$script(HTML('$(document).ready(function() {$(".treeview-menu").css("display", "block");})')))
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName='tab1subtab1',
        verbatimTextOutput('check11')
      ),
      tabItem(tabName='tab1subtab2',
        verbatimTextOutput('check12')
      ),
      tabItem(tabName='tab2subtab1',
        verbatimTextOutput('check21')
      ),
      tabItem(tabName='tab1subtab1',
        verbatimTextOutput('check22')
      )
    )
  )
)

server <- function(input, output, session) {
  observe(print(input$tab))

  output$check11 <- renderPrint(input$tab)
  output$check12 <- renderPrint(input$tab)
  output$check21 <- renderPrint(input$tab)
  output$check22 <- renderPrint(input$tab)
}

shinyApp(ui, server)

在上面的代码中,有一些 HTML 可确保在应用启动时 tab 选项不会折叠。但是,如果用户折叠其中一个选项卡,然后将其取消折叠,则另一个选项卡会自动折叠。这意味着侧边栏无法恢复到两个选项卡都未折叠的原始状态。如何解决这个问题?

更新:我对原始帖子中的代码进行了一些修改。这个新版本具有observe(print(input$tab)) 位,可以根据选择的选项卡修改输出。下面由 GyD 提供的答案回答了我最初的问题,但它不允许我保留我需要的 observe(print(input$tab)) 功能。

【问题讨论】:

    标签: shiny shinydashboard


    【解决方案1】:

    这种行为不是你的js代码引起的,sidebarMenu就是这样。如果选择了一个选项卡,另一个选项卡会自动折叠。

    虽然我不知道如何通过 js 或其他方式进行设置,但我想出的最简单的解决方案是使用 2 sidebarMenu-s 而不是 1。

    同样,这可能不是您想要的,但它应该可以解决崩溃的问题。

    代码:

    library(shiny)
    library(shinydashboard)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(
        sidebarMenu(id='tab',
                    menuItem('tab 1', tabName='tab1',
                             menuSubItem('subtab 1', tabName='tab1subtab1'),
                             menuSubItem('subtab 2', tabName='tab1subtab2')
                    )
        ),
        sidebarMenu(id='tab2',
                    menuItem('tab 2', tabName='tab2',
                             menuSubItem('subtab 1', tabName='tab2subtab1'),
                             menuSubItem('subtab 2', tabName='tab2subtab2')
                    )
        ),
        tags$head(tags$script(HTML('$(document).ready(function() {$(".treeview-menu").css("display", "block");})')))
      ),
      dashboardBody()
    )
    
    server <- function(input, output, session) {
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 谢谢!很简单。
    • 其实我还有一个问题。在我的原始代码中,我的server 函数允许我拥有observe(print(input$tab)),我可以使用它来根据选择的选项卡修改操作。现在好像不可能了。我可以使用observe(print(input$tab1)),但那将只允许tab1subtab1tab1subtab2 选项,而忽略tab2subtab1tab2subtab2。有没有解决的办法? js解决方案是解决这个问题的唯一方法吗?
    • 是的,我没有考虑到,如果您有 2 个sidebarMenu,那么您可以分别选择 1 个项目,这不是您想要的。所以这种方法不是要走的路。
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2020-06-30
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多