#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. Это работает идеально ! Большое вам спасибо за ваше время и помощь ! 🙂