在R Shiny应用程序中动态填充tabName

时间:2016-10-18 01:36:32

标签: r shiny shinydashboard

我正在研究一个复杂的闪亮应用程序。 sidebarMenu包含100多个菜单项,包含一些嵌套项。我也使用模块(callModule)来生成重复的内容。

我遇到的问题是初始加载时间,即28秒。当我运行profvis时,我发现时间在增加,因为该网站正在生成所有100多个菜单项的所有表格,图表和内容。因此,我想在用户点击菜单项时生成内容,而不是在加载网站时生成所有内容。

我使用renderUI创建tabItems和renderMenu来在server.R文件中创建menuItems。

在下面提供的小型可重复示例中,我将sidebarMenu id设置为" smenu"。我在tabItem中调用input $ smenu来设置tabName。这没有按预期工作。如果您运行该示例,您将注意到,如果您1)单击" Dashboard",2)单击" Dashboard2",应显示在dashboard2页面上的h3()内容没有出现。但是,如果你3)点击"仪表板"再次,4)点击" Dashboard2"再次,内容出现。

我有两个问题。 1)在最初加载网站时,仅生成用户要求的内容而不是生成所有内容的最佳方法是什么?

2)为什么此代码会在此次点击后显示内容,而不是在用户首次点击Dashboard2时?

提前感谢任何建议或指示。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(
      id = "smenu",
      sidebarMenuOutput("menu")
    )
  ),
  dashboardBody(
    textOutput("testmenu"),
    uiOutput("bodyUI")
  )
)

server <- function(input, output) {

  observe({
    output$testmenu <- renderText({
      out <- paste("Current menu item is", input$smenu, sep = " ")
    })
  })

  output$bodyUI <- renderUI({
    tabItems(
      tabItem(tabName = input$smenu,
              h3(paste("Hello World! You are on the", input$smenu, "menu item.", sep = " "))
      )
    )
  })  

  output$menu <- renderMenu({
    sidebarMenu(
      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"),
               menuItem("Dashboard2", tabName = "dashboard2", icon = icon("dashboard")),
               menuItem("Dashboard3", tabName = "dashboard3", icon = icon("dashboard"))
      )
    )
  })
} 
shinyApp(ui, server)

1 个答案:

答案 0 :(得分:0)

如果您想使用tabName中的menuItem,则必须为每个tabName定义一个标签:

tabItems(
  tabItem(tabName = "dashboard",
          h3(paste("Hello World! You are on the", input$smenu, "menu item.", sep = " "))
  ),
  tabItem(tabName = "dashboard2",
            h3(paste("Hello World! You are on the", input$smenu, "menu item.", sep = " "))
  ),
  tabItem(tabName = "dashboard3",
            h3(paste("Hello World! You are on the", input$smenu, "menu item.", sep = " "))
  )
)

这将在第一个菜单选择后显示选项卡(因为选项卡在服务器中定义)

此外,您应将菜单id移至renderMenu

  output$menu <- renderMenu({
    sidebarMenu(id = "smenu",
      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"),
               menuItem("Dashboard2", tabName = "dashboard2", icon = icon("dashboard")),
               menuItem("Dashboard3", tabName = "dashboard3", icon = icon("dashboard"))
      )
    )
  })

并简化ui

...
  dashboardSidebar(
      sidebarMenuOutput("menu")
  ),
...