我正在研究一个复杂的闪亮应用程序。 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)
答案 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")
),
...