【问题标题】:Reproduce a flexdashboard layout with shinydashboard使用 shinydashboard 重现 flexdashboard 布局
【发布时间】:2020-11-05 03:54:37
【问题描述】:

我正在尝试使用持久侧边栏和多个选项卡来重现 flexdashboard 简单布局。这个问题类似于我最近问过的this one,但在后者中我使用了另一个 SO 答案中的一些代码,而在这个问题中我使用了简单的flexdashboard 代码。

这是一个简单的flexdashboard 布局:

---
title: "Title of a Shiny app"
output: 
  flexdashboard::flex_dashboard
runtime: shiny
---

Sidebar {.sidebar}
=====================================

```{r}
textInput("test", "test")
actionButton("test_2", "test 2")
```

Tab 1
=====================================  

Tab 2
=====================================  

Tab 3
=====================================  

您可以看到它将持久侧边栏与导航栏混合在一起。

但是,我不知道如何在shinydashboard 中重现此内容:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    textInput("test", "test"),
    actionButton("test_2", "test 2")
  ),
  dashboardBody(
    tabsetPanel(
      tabPanel("Tab 1"),
      tabPanel("Tab 2"),
      tabPanel("Tab 3") 
    )
  )
)

server <- function(input, output, session) {
  
}

shinyApp(ui, server)

此示例中的选项卡不是导航栏,就像 flexdashboard 示例中的那样。

是否有一种简单的方式(即不使用几十行 CSS)来使用 shinydashboard(或其他解决方案)生成 flexdashboard 示例?

【问题讨论】:

  • 也许{shinydashboardPlus } 是这里的一个选项。虽然还没有得到我想要的结果,但它也是另一个依赖项。

标签: r shiny flexdashboard


【解决方案1】:

我不确定这是否适合您,但您可以使用 shinydashboard 的 dropdownMenuhidden dashboardSidebar 来模仿 flexdashboard 的外观。但是,默认情况下菜单是向右对齐的:

library(shiny)
library(shinydashboard)
library(shinyjs)

ui <- dashboardPage(
  dashboardHeader(
    tags$li(class = "dropdown",
            tags$li(class = "dropdown", actionLink(inputId = "tab1dropdown", label = "Tab 1"), style = "position: absolute; left: 4.3%; top: 50%; transform: translate(-50%, -50%); font-weight: bold;"),
            tags$li(class = "dropdown", actionLink(inputId = "tab2dropdown", label = "Tab 2"), style = "position: absolute; left: 8%; top: 50%; transform: translate(-50%, -50%); font-weight: bold;"),
            tags$li(class = "dropdown", actionLink(inputId = "tab3dropdown", label = "Tab 3"), style = "position: absolute; left: 11.7%; top: 50%; transform: translate(-50%, -50%); font-weight: bold;"),
    )
  ),
  dashboardSidebar(
    textInput("test", "test"),
    actionButton("test_2", "test 2"),
    hidden(sidebarMenu(
        id = "sidebarID",
        menuItem("tab1", tabName = "tab1"),
        menuItem("tab2", tabName = "tab2"),
        menuItem("tab3", tabName = "tab3")
      ))
  ),
  dashboardBody(
    useShinyjs(),
    tabItems(
      tabItem("tab1", "Tab 1 content"),
      tabItem("tab2", "Tab 2 content"),
      tabItem("tab3", "Tab 3 content")
    )
  )
)

server <- function(input, output, session) {
  
  observeEvent(input$tab1dropdown, {
    updateTabItems(session, "sidebarID", selected = "tab1")
  })
  observeEvent(input$tab2dropdown, {
    updateTabItems(session, "sidebarID", selected = "tab2")
  })
  observeEvent(input$tab3dropdown, {
    updateTabItems(session, "sidebarID", selected = "tab3")
  })
  
}

shinyApp(ui, server)

【讨论】:

  • 确实标签的位置并不理想,我更喜欢它在左边。但我对在shinydashboard 中使用导航栏选项卡的复杂性感到惊讶,而使用flexdashboard 只需几行即可
  • shinydashboard 或者更确切地说 AdminLTE 只是使用另一种导航方法。在我看来,它不打算通过标题中的标签进行导航。
  • 需要一些手动调整,但现在选项卡向左对齐。请查看我的编辑。
  • 对齐又不完美,当我将它们悬停时,选项卡之间有一些重叠。也许这是由于屏幕尺寸的原因。
  • 是的,CSS 远非完美。要么把它放在另一个问题中,找一个对 css 有更多经验的人,要么你开始花一些时间自己解决问题....
猜你喜欢
  • 2018-05-02
  • 2021-11-19
  • 2016-09-18
  • 2019-03-24
  • 1970-01-01
  • 2019-05-17
  • 2018-07-20
  • 2016-07-26
  • 2020-03-30
相关资源
最近更新 更多