Переключатель темного режима не работает с помощью navbarPage — блестящий

#r #shiny

Вопрос:

У меня есть блестящее приложение, для которого я хотел бы добавить переключатель темного режима. Мне удалось сделать это после некоторых исследований в Интернете, но когда я пытался реализовать этот фрагмент кода в своем приложении, я столкнулся с проблемами. Я попробовал несколько вещей в более простом приложении, чтобы попытаться определить, что заставляет переключатель не работать, и я пришел к выводу, что добавление страницы навигационной панели в мое приложение приводит к сбою. Ниже приведен простой пример:

 library(shiny) library(DT) library(shinyWidgets) library(bslib)  ui lt;- fluidPage(  theme=bs_theme(),  # navbarPage("TITLE",  sidebarLayout(  sidebarPanel(  numericInput("num", label = h3("Numeric input"), value = 1),  materialSwitch(inputId = "mode", label = icon("moon"), right=TRUE,status = "success")),  mainPanel(verbatimTextOutput("value")) #fin main panel  )   # ) )   server lt;- function(input, output,session) {  observe({  if(input$mode==TRUE)  session$setCurrentTheme(bs_theme_update(theme, bootswatch = "superhero"))  if(input$mode==FALSE)  session$setCurrentTheme(bs_theme_update(theme, bootswatch = "default"))  })    output$value lt;- renderPrint({ input$num }) } shinyApp(ui, server)  

Пока строка навигационной панели и соответствующий «)» рассматриваются как комментарий, он работает нормально, но как только я раскомментирую эти две строки, я получу эту ошибку:

 Warning: Navigation containers expect a collection of `bslib::nav()`/`shiny::tabPanel()`s and/or `bslib::nav_menu()`/`shiny::navbarMenu()`s. Consider using `header` or `footer` if you wish to place content above (or below) every panel's contents.  Listening on http://--.-- Warning: Error in : session$setCurrentTheme() cannot be used to change the Bootstrap version from to 4. Try using `bs_theme(version = 4)` for initial theme.  47: stop  46: session$setCurrentTheme  45: observe [C:/Users/user/Documents/shiny/SHINY-APP/app4.R#23]  44: lt;observergt;  1: runApp  

Я очень новичок в shiny, несмотря на то, что знаком с R, но я действительно не понимаю этой ошибки. Я пытался найти ответы в документации, связанной с различными функциями, которые я использую, а также в ранее задаваемых вопросах по SO, но я еще не смог это исправить.

Любая помощь будет очень признательна! Спасибо!

Комментарии:

1. Я скопировал ваш код и выдал мне ошибку: Предупреждение: Ошибка в is_bs_theme: объект «тема» не найден [Трассировка стека недоступна] Я изменил theme внутреннюю bs_theme_update часть на bs_theme() и работал.

2. Затем я раскомментировал строки navbarPage и получил следующее сообщение об ошибке: Предупреждающее сообщение: Контейнеры навигации ожидают коллекцию bslib::nav() / shiny::tabPanel() s и/или bslib::nav_menu() / shiny::navbarMenu() s. Рассмотрите возможность использования header или footer , если вы хотите, чтобы содержимое размещалось выше (или ниже) содержимого каждой панели.

3. @Pabort Спасибо вам за ваши комментарии ! У меня есть те же предупреждения перед ошибкой, когда я раскомментирую строки страницы navbarPage (я забыл включить предупреждение в свой пост, я отредактирую его). Мое понимание верхнего/нижнего колонтитула состояло в том, что он используется для размещения объекта (например, переключателя материалов) выше или ниже всех панелей боковой панели и основной панели. Я попытался поместить переключатель в нижний колонтитул, но это не исправляет ошибку…

Ответ №1:

Вы должны указать тему как на странице fluid, так и на странице navbarPage (возможно, вы можете избавиться от страницы fluid, не тестировали ее).

 library(shiny) library(DT) library(shinyWidgets) library(bslib)  ui lt;- fluidPage(  theme=bs_theme(version = 4, bootswatch = "default"),  navbarPage("TITLE",  theme=bs_theme(version = 4, bootswatch = "default"),  tabPanel("Tab",  sidebarLayout(  sidebarPanel(  numericInput("num", label = h3("Numeric input"), value = 1),  materialSwitch(inputId = "mode", label = icon("moon"),  right=TRUE,status = "success")),  mainPanel(verbatimTextOutput("value")) #fin main panel  )  )  ) )   server lt;- function(input, output,session) {     observe(session$setCurrentTheme(  if(isTRUE(input$mode)){  bs_theme(bootswatch = "superhero")  } else {  bs_theme(bootswatch = "default")  }  ))    output$value lt;- renderPrint({ input$num }) } shinyApp(ui, server)  

Комментарии:

1. Это связано с тем, что navbarPage по умолчанию использует версию 3 начальной загрузки и не наследует версию, которую вы используете в верхнем div

2. Это работает идеально ! Большое вам спасибо за ваше время и помощь ! 🙂