es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualiza el contenido de tabPanel con la selección en el control de la barra lateral | Shiny R

Estoy creando una aplicación muy sencilla de Shiny, donde quiero actualizar el contenido de tabPanel con lo que se seleccione en sidebarMenu, sin importar qué pestaña esté seleccionada. A continuación se muestra mi código de ejemplo. Por favor, avísame si estoy haciendo algo mal.

library(shinydashboard)

siderbar <- dashboardSidebar(
  sidebarMenu(
    # Add buttons to choose the way you want to select your data
    radioButtons("select_by", "Select by:",
                 c("Food Type" = "Food",
                   "Gym Type" = "Gym",
                   "TV show" = "TV"))
  )
)

body <- dashboardBody(
  fluidRow(
    tabBox(
      side = "right",
      selected = "Tab3",
      tabPanel("Tab1", "Tab content 1"),
      tabPanel("Tab2", "Tab content 2"),
      tabPanel("Tab3", "Tab content 3")
    )
  )
)

shinyApp(
  ui = dashboardPage(
    dashboardHeader(title = "tabBoxes"),
    siderbar,
    body
  ),
  server = function(input, output) {

    getReaction <- reactive(input$select_by)

    # The currently selected tab from the first box
    output$tabset1Selected <- renderText({
      getReaction()
    })

  }
)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas en el código proporcionado:

    1. La variable siderbar está mal escrita. Debería ser sidebar.
    2. La función reactive() no es necesaria en la variable getReaction. Puede asignarse directamente el valor de input$select_by.

    3. Para actualizar el contenido de los paneles de pestañas en función del elemento seleccionado del menú lateral, es necesario utilizar la función observe(). Luego, el contenido de los paneles de pestañas puede ser actualizado utilizando la función updateTabsetPanel().

    Aquí está el código corregido:

    library(shinydashboard)
    
    sidebar <- dashboardSidebar(
      sidebarMenu(
        # Agregar botones para seleccionar la forma en que desea seleccionar sus datos
        radioButtons("select_by", "Seleccionar por:",
                     c("Tipo de comida" = "Food",
                       "Tipo de gimnasio" = "Gym",
                       "Programa de televisión" = "TV"))
      )   
    )
    
    body <- dashboardBody(
      fluidRow(
        tabBox(
          side = "right",
          id = "tabs",
          selected = "Tab3",
          tabPanel("Tab1", "Contenido de la pestaña 1"),
          tabPanel("Tab2", "Contenido de la pestaña 2"),
          tabPanel("Tab3", "Contenido de la pestaña 3")
        )
      ),
    )
    
    shinyApp(
      ui = dashboardPage(
        dashboardHeader(title = "tabBoxes"),
        sidebar,
        body
      ),
      server = function(input, output, session) {
    
        observe({
          selected_tab <- switch(input$select_by,
                                 Food = "Tab1",
                                 Gym = "Tab2",
                                 TV = "Tab3")
    
          updateTabsetPanel(session, "tabs", selected = selected_tab)
        })
    
      }
    )
    

    Ten en cuenta que he añadido un argumento id a la función tabBox() para facilitar su referencia en el código del servidor. Además, el objeto session debe ser pasado a la función updateTabsetPanel() para que funcione correctamente.

Comments are closed.