【问题标题】:Is it possible to conditionally show the controlbar in shiny apps?是否可以有条件地在闪亮的应用程序中显示控制栏?
【发布时间】:2023-01-28 04:37:39
【问题描述】:

我只想显示左侧栏中几个选项卡的控制栏(右侧栏)。

library(shiny)
library(bs4Dash)

shinyApp(
  ui = dashboardPage(
    header = dashboardHeader(
      title = "My dashboard"
    ),
    sidebar = dashboardSidebar(
      
      sidebarMenu(
        id = "sidebarMenu",
        menuItem(
          text = "Tab 1",
          tabName = "tab1"
        ),
        menuItem(
          text = "Tab 2",
          tabName = "tab2"
        )
      )
      
    ),
    body = dashboardBody(),
    controlbar = dashboardControlbar(),
    title = "DashboardPage"
  ),
  server = function(input, output) { }
)

我尝试开发一个闪亮的应用程序,其中对于某些选项卡,控制栏是必需的,对于其他选项卡,控制栏应该显示某些选项,而对于其他选项卡,它是显而易见的。确保这一点的最优雅方法是什么?我应该将外观“外包”到单独的模块中还是有其他建议?

【问题讨论】:

    标签: r shiny bs4dash


    【解决方案1】:

    这是可能的,并且有很多不同的方法可以实现这一点。 不同的方法各有优缺点。 我可以向最常用的条件 UI 元素演示基本的 Shiny 方法。 “简单”解决方案中的共同点每个选项卡的条件 UI 问题是以某种方式评估用户当前查看的选项卡。

    第一种方法是检查 Javascript 上下文并使用 conditionalPanel 调整 UI:

    shinyApp(
      ui = dashboardPage(
        header = dashboardHeader(
          title = "My dashboard"
        ),
        sidebar = dashboardSidebar(
          sidebarMenu(
            id = "sidebarMenu",
            menuItem(
              text = "Tab 1",
              tabName = "tab1"
            ),
            menuItem(
              text = "Tab 2",
              tabName = "tab2"
            ),
            menuItem(
              text = "Tab 3",
              tabName = "tab3"
            )
          )
        ),
        body = dashboardBody(),
        controlbar = dashboardControlbar(
          id= "controlbar",
          collapsed = TRUE,
          conditionalPanel(
            condition = "input.sidebarMenu=='tab1'||input.sidebarMenu=='tab3'",
            controlbarMenu(
              controlbarItem(title = "Item1"),
              controlbarItem(title = "Item2")
              )
            ),
            conditionalPanel(
              condition = "input.sidebarMenu=='tab2'",
              controlbarMenu(
                controlbarItem(title = "Item3")
              )
            ),
            conditionalPanel(
              condition = "input.sidebarMenu=='tab3'",
              controlbarMenu(
              controlbarItem(title = "Item4")
              )
          )
        ),
        title = "DashboardPage"
      ),
      server = function(input, output,session) { }
    )
    

    好处显然是渲染速度更快,因为它是在 UI(客户端)内部进行评估的。缺点是我们必须使用 Javascript(我们可能不想这样做),而且我们在 UI 函数中创建逻辑,使其更加混乱。

    下一个方法是使用 R 并在服务器函数中呈现 UI 的某些部分并将其发送到 UI 中的输出函数

    shinyApp(
      ui = dashboardPage(
        header = dashboardHeader(
          title = "My dashboard"
        ),
        sidebar = dashboardSidebar(
          sidebarMenu(
            id = "sidebarMenu",
            menuItem(
              text = "Tab 1",
              tabName = "tab1"
            ),
            menuItem(
              text = "Tab 2",
              tabName = "tab2"
            ),
            menuItem(
              text = "Tab 3",
              tabName = "tab3"
            )
          )
        ),
        body = dashboardBody(),
        controlbar = dashboardControlbar(
          id= "controlbar",
          collapsed = TRUE,
          sidebarMenuOutput("Menu")
          ),
        title = "DashboardPage"
      ),
      server = function(input, output,session) { 
        observeEvent(input$sidebarMenu, {
            output$Menu <- renderMenu({
              if(input$sidebarMenu=="tab1") {
              controlbarMenu(
                controlbarItem(
                  title = "Item1"
                )
              )
              }else if(input$sidebarMenu=="tab2"){
                controlbarMenu(
                  controlbarItem(
                    title = "Item2"
                  ),
                  controlbarItem(
                    title = "Item2_2"
                  )
                )
              }else{
                controlbarMenu()
              }
            })
        })
        }
    )
    

    好处是我们在 Server 函数中有逻辑,我们的 UI 变得更加简洁。缺点是我们向服务器添加了额外的计算工作,这可以在客户端完成。我们还必须编写一些if else statments 或mapapply 并且不清楚应该在服务器函数中呈现多少 UI。如果你想添加一个功能,它也会变得更加复杂,所以如果你不小心并提前计划反应等,你经常在开发过程中重写它。

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      相关资源
      最近更新 更多