这是可能的,并且有很多不同的方法可以实现这一点。
不同的方法各有优缺点。
我可以向最常用的条件 UI 元素演示基本的 Shiny 方法。
“简单”解决方案中的共同点每个选项卡的条件 UI 问题是以某种方式评估用户当前查看的选项卡。
第一种方法是检查 Javascript 上下文并使用 conditionalPanel 调整 UI:
shinyApp(
ui = dashboardPage(
header = dashboardHeader(
title = "My dashboard"
),
sidebar = dashboardSidebar(
sidebarMenu(
id = "sidebarMenu",
menuItem(
text = "Tab 1",
tabName = "tab1"
),
menuItem(
text = "Tab 2",
tabName = "tab2"
),
menuItem(
text = "Tab 3",
tabName = "tab3"
)
)
),
body = dashboardBody(),
controlbar = dashboardControlbar(
id= "controlbar",
collapsed = TRUE,
conditionalPanel(
condition = "input.sidebarMenu=='tab1'||input.sidebarMenu=='tab3'",
controlbarMenu(
controlbarItem(title = "Item1"),
controlbarItem(title = "Item2")
)
),
conditionalPanel(
condition = "input.sidebarMenu=='tab2'",
controlbarMenu(
controlbarItem(title = "Item3")
)
),
conditionalPanel(
condition = "input.sidebarMenu=='tab3'",
controlbarMenu(
controlbarItem(title = "Item4")
)
)
),
title = "DashboardPage"
),
server = function(input, output,session) { }
)
好处显然是渲染速度更快,因为它是在 UI(客户端)内部进行评估的。缺点是我们必须使用 Javascript(我们可能不想这样做),而且我们在 UI 函数中创建逻辑,使其更加混乱。
下一个方法是使用 R 并在服务器函数中呈现 UI 的某些部分并将其发送到 UI 中的输出函数
shinyApp(
ui = dashboardPage(
header = dashboardHeader(
title = "My dashboard"
),
sidebar = dashboardSidebar(
sidebarMenu(
id = "sidebarMenu",
menuItem(
text = "Tab 1",
tabName = "tab1"
),
menuItem(
text = "Tab 2",
tabName = "tab2"
),
menuItem(
text = "Tab 3",
tabName = "tab3"
)
)
),
body = dashboardBody(),
controlbar = dashboardControlbar(
id= "controlbar",
collapsed = TRUE,
sidebarMenuOutput("Menu")
),
title = "DashboardPage"
),
server = function(input, output,session) {
observeEvent(input$sidebarMenu, {
output$Menu <- renderMenu({
if(input$sidebarMenu=="tab1") {
controlbarMenu(
controlbarItem(
title = "Item1"
)
)
}else if(input$sidebarMenu=="tab2"){
controlbarMenu(
controlbarItem(
title = "Item2"
),
controlbarItem(
title = "Item2_2"
)
)
}else{
controlbarMenu()
}
})
})
}
)
好处是我们在 Server 函数中有逻辑,我们的 UI 变得更加简洁。缺点是我们向服务器添加了额外的计算工作,这可以在客户端完成。我们还必须编写一些if else statments 或map 或apply 并且不清楚应该在服务器函数中呈现多少 UI。如果你想添加一个功能,它也会变得更加复杂,所以如果你不小心并提前计划反应等,你经常在开发过程中重写它。