Shiny: самостоятельно перемещаться по двум tabsetPanels - PullRequest
0 голосов
/ 28 сентября 2018

Можно ли независимо перемещаться по двум меню в Shiny?

Я хотел бы иметь две панели tabset (см. Рисунок ниже), но если я переключаюсь между вкладками в верхнем менюЯ хочу, чтобы выбранная панель в нижнем меню сохранялась.

Один из способов навигации по нескольким tabsetPanels - просто запустить другое приложение Shiny внутри моего основного приложения.Однако это нежелательный результат, поскольку переключение вкладок в верхнем меню теперь также влияет на то, какая вкладка открыта в нижнем меню.

Пример того, что я сейчас использую:

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("Normal", shinyAppDir("Distributions/Normal"))),
    tabPanel("Binomial", shinyAppDir("Distributions/Binomial"))
    # etc.
  )
)

Где каждое вызываемое приложение имеет свою собственную tabsetPanel:

ui <- fluidPage(
  tabsetPanel(
              tabPanel("Theoretical distribution", plotOutput("plot1")),
              tabPanel("Draw Samples", plotOutput("plot2")),
              tabPanel("Explanation", verbatimTextOutput("explanation"))
  )
)

Результат:

two_menus

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете использовать id, updateTabsetPanel и reactiveValues, чтобы достичь того, что вам нужно.

Используйте reactiveValue, чтобы сохранить выбранный номер вашего суб tabPanel, затем нажмите updateTabsetPanel чтобы изменить выбранный по умолчанию суб tabPanel при переключении основного tabPanel.

Попробуйте следующий код:

Вы можете использовать id, updateTabsetPanel и reactiveValuesчтобы достичь того, что вам нужно.

Используйте reactiveValue, чтобы сохранить выбранный вами суб tabPanel номер, затем используйте updateTabsetPanel, чтобы изменить выбранный по умолчанию суб tabPanel при переключении основного * 1024.*.

Попробуйте следующий код:

shiny::runApp(list(
    ui = bootstrapPage(

      tabsetPanel(id = "mainTab",
                  tabPanel("Tab1", tabsetPanel(id = "subTab1", 
                                               tabPanel("subTab11",value=1),
                                               tabPanel("subTab12",value=2),
                                               tabPanel("subTab13",value=3),
                                               selected = 1
                  )),
                  tabPanel("Tab2", tabsetPanel(id = "subTab2", 
                                               tabPanel("subTab21",value=1),
                                               tabPanel("subTab22",value=2),
                                               tabPanel("subTab23",value=3),
                                               selected = 1
                  ))
      )

    ),
    server = function(input, output,session) {

      current_subtab<-reactiveValues(selected=1)


      # when either sub tabPanel change, save the current selected sub tabPanel to reactiveValues
      observeEvent(c(input$subTab1,input$subTab2),{
        if(input$mainTab=="Tab1"){
          current_subtab$selected<-input$subTab1
        }else if(input$mainTab=="Tab2"){
          current_subtab$selected<-input$subTab2
        }
      })

      # when main tabPanel changed, update the default select subPanel value
      observeEvent(input$mainTab,{
        if(input$mainTab=="Tab1"){
          updateTabsetPanel(session,"subTab1",selected = current_subtab$selected)
        }else if(input$mainTab=="Tab2"){
          updateTabsetPanel(session,"subTab2",selected = current_subtab$selected)
        }
      })
    }
  ))
...