Я создаю приложение Shiny, используя отличный пакет ShinyDashoardPlus
(стилизованный под тему из пакета Dashboardthemes
), в котором три tabItems
содержат содержимое для трех разделов приложения (раздел A, разделB и раздел C), доступны через sidebarMenu
слева dashboardSidebar
и правой боковой панели с двумя вкладками (реализовано как rightSidebarTabContent
со следующими идентификаторами: T_A
и T_B
), удерживающими элементы управления для исследованиядалее содержание разделов A и B. соответственно.
Поскольку rightSidebarTabContent
T_A
относится только к section A
, а rightSidebarTabContent
T_B
относится только к section B
, я бы хотелчто (1) пользователь щелкнет по пунктам меню левой боковой панели A или B и может активировать соответствующую вкладку в правой боковой панели .Более того, поскольку ни один из rightSidebarTabContents
не имеет отношения к section C
, я также хотел бы, чтобы (2) пользователь щелкнул левой кнопкой мыши на элементе меню боковой панели C и мог закрыть панель прав, если он открыт.
Я нашел возможную подсказку о том, как решить мои проблемы ( Автоматическое всплывающее окно rightSidebar при нажатии на MenuItem в shinydashboardPlus ), и я действительно смог частично решить свою первую проблему, добавив /удаление некоторого класса CSS с помощью shinyjs
для активации части различных вкладок в rightSidebar
при нажатии на menuItems
.
Как я уже сказал, это решение частично работает для моей первой проблемы, хотя тольконижняя часть rightSidebarTabContent
активируется / деактивируется таким образом, но не заголовок вкладки со значками для навигации между ними.Более того, возможно, из-за добавления дополнительных классов CSS, когда я применяю тему «shinydashboard» «темный», я не могу переключать закрытие пункта меню rightSidebar
при щелчке section C
(выпуск № 2).
Подводя итог:
- Элемент правой боковой панели
T_A
должен расширяться при выборе элемента левой боковой панели section A
.Аналогично для T_A
и section B
. - Правая боковая панель должна разрушаться, если на левой боковой панели выбрано
section C
Может кто-нибудь помочь с этим?Заранее спасибо за любую помощь!
library(shiny)
library(shinyjs)
library(shinyWidgets)
library(shinydashboard)
library(shinydashboardPlus)
library(dashboardthemes)
ui <- dashboardPagePlus(
useShinyjs(),
header = dashboardHeaderPlus(
title = "Dashboard",
enable_rightsidebar = TRUE,
rightSidebarIcon = "info-circle"
),
sidebar = dashboardSidebar(
sidebarMenu(
menuItem("Section A", tabName = "Section_A", icon = icon("map")),
menuItem("Section B", tabName = "Section_B", icon = icon("chart-line")),
menuItem("Section C", tabName = "Section_C", icon = icon( "gears")),
id = "nav"
)
),
body = dashboardBody(
shinyDashboardThemes(
theme = "grey_dark"
),
tabItems(
tabItem(
tabName = "Section_A",
p("Some content for section A")),
tabItem(
tabName = "Section_B",
p("Some content for section B")),
tabItem(
tabName = "Section_C",
p("Some content for section C"))
)
),
rightsidebar = rightSidebar(
background = "dark",
rightSidebarTabContent(
id = "T_A",
title = "Tab for section A",
icon = "desktop",
active = TRUE,
p("Some content frelevant for section A"),
sliderInput(
"obs",
"Number of observations:",
min = 0, max = 1000, value = 500
)
),
rightSidebarTabContent(
id = "T_B",
title = "Tab for section B",
p("Some content frelevant for section B"),
textInput("caption", "Caption", "Data Summary")
)
),
title = "Right Sidebar"
)
server <- function(input, output) {
observe({
if (req(input$nav) == "Section_A"){
message("Section A has been selected")
shinyjs::removeClass(id = "control-sidebar-T_A-tab", class = "tab-pane")
shinyjs::removeClass(id = "control-sidebar-T_B-tab", class = "tab-pane active")
shinyjs::addClass(id = "control-sidebar-T_A-tab", class = "tab-pane active")
shinyjs::addClass(id = "control-sidebar-T_B-tab", class = "tab-pane")
}
if (req(input$nav) == "Section_B"){
message("Section B has been selected")
shinyjs::removeClass(id = "control-sidebar-T_B-tab", class = "tab-pane")
shinyjs::removeClass(id = "control-sidebar-T_A-tab", class = "tab-pane active")
shinyjs::addClass(id = "control-sidebar-T_B-tab", class = "tab-pane active")
shinyjs::addClass(id = "control-sidebar-T_A-tab", class = "tab-pane")
}
if (req(input$nav) == "Section_C"){
message("Section C has been selected")
shinyjs::removeClass(selector = "aside.control-sidebar-open aside.control-sidebar-dark", class = "control-sidebar-open aside.control-sidebar-dark-open")
shinyjs::addClass(selector = "aside.control-sidebar", class = "control-sidebar")
}
})
}
shinyApp(ui = ui, server = server)