Renderizar dashboardSidebar dinámicamente solo cuando el usuario hace clic en tabPanel.
Estoy tratando de renderizar el dashboardSidebar
dinámicamente al hacer clic en tabPanel
, para que los controles en todas las pestañas no se carguen al inicializar la aplicación. Para eso he creado una función load_tab2
pero esta función no está mostrando nada al hacer clic en la pestaña. ¿Alguien puede señalar el problema con el código a continuación?
library(shiny)
library(shinydashboard)
sidebar <- dashboardSidebar(
collapsed = FALSE,
sidebarMenu(
id = "menu_sidebar",
conditionalPanel(
condition = "input.main_tab == 'tab_1'",
selectizeInput(inputId = "t1", label = "Select by:", choices = c(as.character(30:40))),
div("Hello Tab 1")
))
)
body <- dashboardBody(
fluidRow(
tabsetPanel(
id = "main_tab",
selected = "tab_1",
tabPanel(title = "tab_1", "Tab content 1"),
tabPanel(title = "tab_2", "Tab content 2")
)
)
)
load_tab2 <- function(input, output, session){
observeEvent(input$main_tab == 'tab_2', {
insertUI(
selector = "#menu_sidebar",
where = "afterEnd",
ui = conditionalPanel(
condition = "input.main_tab == 'tab_2'",
selectizeInput(inputId = "t2", label = "Select by:", choices = c(as.character(40:50))),
div("Hello Tab 2")
),
immediate = TRUE,
session = getDefaultReactiveDomain()
)
}, ignoreInit = TRUE, once = TRUE)
}
shinyApp(
ui = dashboardPage(
dashboardHeader(title = "tabBoxes"),
sidebar,
body
),
server = function(input, output, session) {
callModule(load_tab2, "load_tab2_id")
}
)
davy.ai
El problema con el código es que la función
load_tab2
no está siendo llamada en ninguna parte de la aplicación. Has definido la función, pero necesitas llamarla en la función del servidor para que funcione. Para hacer esto, puedes añadirload_tab2(input, output, session)
dentro de la función del servidor, después de la líneacallModule
.Además, es importante tener en cuenta que la función
getDefaultReactiveDomain()
ya no está disponible en versiones más recientes de Shiny, y se recomienda utilizargetDefaultReactiveDomain(session)
en su lugar.