我有以下问题:
我想在tabItem(s)之间切换时改变侧边栏。
dashboardPage(
dasboardHeader(title = ""),
dashboardSidebar(
sidebarMenu(
menuItem("1", tabName = "1"),
menuItem("2", tabName = "2")
),
#I want this to be displayed when menuItem "1" is clicked
tabsetPanel(
tabPanel("t1", val="t1",
.... some inputs),
tabPanel("t2", val="t2",
.... some inputs)
),
# This to be displayed when menuItem "2" is clicked
selectInput("s1", label="Select"....),
selectInput("s2", label="Select2"...)
)
dashboardBody(
tabItem(tabName="1",
.......
),
tabItem(tabName="2",
........
)
)
)
我有dashboardBody改变时,切换选项卡之间,但不知道如何改变dashboardSidebar值。在dashboardSidebar中尝试过:
conditionalPanel(
condition="tabName='1'",
#displaying first version of DashboardSidebar
),
conditionalPanel(
condition="tabName='2'",
#displaying second version of DashboardSidebar
)
但这对我不起作用。
任何想法?
谢谢你的帮助。
首先,您必须添加sidebarMenu
一个ID,该ID将用于Shiny输入值,并且它将报告哪个选项卡被选中。
之后将uiOutput
添加到dashboardSidebar
功能中。
uiOutput
将根据所选选项卡接收tabsetPanel
或两个selectInput
s。
最后,在服务器端定义的renderUI
中,只需要创建条件语句。这是简单的部分。
棘手的部分是您必须将selectInput
打包到一个列表中—否则只有第二个小部件将被发送到UI。更棘手的部分是,当您希望通过renderUI
将tabsetPanel
发送到UI时,您必须指定ID
。(这是非常棘手的,因为通常你不需要指定它的ID
!)
完整例子:
library(shiny)
library(shinydashboard)
rm(ui)
rm(server)
ui <- dashboardPage(
dashboardHeader(title = ""),
dashboardSidebar(
# added ID which will be used for a Shiny input value,
# and it will report which tab is selected.
sidebarMenu(id = "tab",
menuItem("1", tabName = "1"),
menuItem("2", tabName = "2")
),
uiOutput("out1")
),
dashboardBody(
tabItem(tabName = "1"),
tabItem(tabName = "2")
)
)
server <- function(input, output) {
output$out1 <- renderUI({
if (input$tab == "1") {
dyn_ui <- tabsetPanel(id = "tabset_id", selected = "t1",
tabPanel("t1", value = "t1"),
tabPanel("t2", value = "t2"))
}
if (input$tab == "2") {
dyn_ui <- list(selectInput("s1", label = "Select", choices = letters[1:3]),
selectInput("s2", label = "Select2", choices = letters[4:6]))
}
return(dyn_ui)
})
}
shinyApp(ui, server)