选择不同的 tabItem 时,Shiny dashboardSidebar 会发生变化
Shiny dashboardSidebar change when different tabItem selected
我遇到了以下问题:
我想要在 tabItem 之间切换时更改边栏。
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
一个用于 Shiny 输入值的 ID,它会报告选择了哪个选项卡。
之后,将uiOutput
添加到dashboardSidebar
函数中。
uiOutput
将根据所选选项卡接收 tabsetPanel
或两个 selectInput
。
最后,在您在服务器端定义的 renderUI
中,您只需要创建条件语句。这是简单的部分。
棘手的部分是您必须将 selectInput
包装到一个列表中 - 否则只有第二个小部件会被发送到 UI。更棘手的部分是,当你想通过 renderUI
将它发送到 UI 时,你必须指定 tabsetPanel
的 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)
我遇到了以下问题:
我想要在 tabItem 之间切换时更改边栏。
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
一个用于 Shiny 输入值的 ID,它会报告选择了哪个选项卡。
之后,将uiOutput
添加到dashboardSidebar
函数中。
uiOutput
将根据所选选项卡接收 tabsetPanel
或两个 selectInput
。
最后,在您在服务器端定义的 renderUI
中,您只需要创建条件语句。这是简单的部分。
棘手的部分是您必须将 selectInput
包装到一个列表中 - 否则只有第二个小部件会被发送到 UI。更棘手的部分是,当你想通过 renderUI
将它发送到 UI 时,你必须指定 tabsetPanel
的 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)