R语言 有没有可能有条件地在闪亮的应用程序中显示控制栏?

gcuhipw9  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(124)

我想显示控制栏(右边栏)只为几个标签在左边栏。

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) { }
)

我试着开发一个闪亮的应用程序,其中一些标签页需要一个控制栏,另一些标签页的控制栏应该显示某些选项,而另一些标签页则是显而易见的。什么是最优雅的方式来确保这一点?我应该将外观“外包”到单独的模块中,还是有其他建议?

lawou6xi

lawou6xi1#

这是可能的,而且有很多不同的方法来实现这一点。不同的方法有其优点和缺点。我可以演示最常用的条件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,在Server函数中呈现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()
          }
        })
    })
    }
)

这样做的好处是我们在服务器函数中有了逻辑,用户界面也变得更加简洁。不足之处是我们给服务器增加了额外的计算工作,这可以在客户端完成。我们还必须编写一些if else语句或mapapply,并且不清楚应该在服务器函数中呈现多少UI。如果你想添加一个特性,它也会变得更加复杂,所以如果你不小心,提前计划React性等,你经常会在开发过程中重写很多。

相关问题