activate tabpanel from another tabpanel

前端 未结 2 1315
傲寒
傲寒 2020-12-03 13:02

I want when i start the application the tab panel tab2 = desactivated, and will be activated once i click the button in the first tab panel tab1, i tried with shinyjs and th

相关标签:
2条回答
  • 2020-12-03 13:11

    Some small clarifications on the arguments value, id, and value working from @DeanAttali's reprex:

    library("shiny")
    library("shinyjs")
    require("V8") ## req for shinyjs::extendShinyjs()
    
    ## JavaScript snipit that dis/enables the ABILITY to click the tab (without changing aesthetics)
    app_jscode <-
      "shinyjs.disableTab = function(name) {
        var tab = $('.nav li a[data-value=' + name + ']');
        tab.bind('click.tab', function(e) {
          e.preventDefault();
          return false;
        });
        tab.addClass('disabled');
      }
      shinyjs.enableTab = function(name) {
        var tab = $('.nav li a[data-value=' + name + ']');
        tab.unbind('click.tab');
        tab.removeClass('disabled');
      }"
    ## css snipit that makes it LOOK like we are/n't able click the tab (with outchanging functionality)
    app_css <-
      ".nav li a.disabled {
        background-color: #aaa !important;
        color: #333 !important;
        cursor: not-allowed !important;
        border-color: #aaa !important;
      }"
    
    ui = fluidPage(
      shinyjs::useShinyjs(),
      shinyjs::extendShinyjs(text = app_jscode),
      shinyjs::inlineCSS(app_css),
      navbarPage(title = "Navbar title!", id = "navbarid",
                 tabPanel(title = "tab1", ## id and value args not needed
                          br(),
                          p("in tab 1."),
                          actionButton("btn", label = "toggle locked tabs")),
                 tabPanel(title = "tab2", ## id and value args not needed
                          p("in tab 2."))
      )
    )
    server = function(input, output, session) {
      ## Sisable tab2 on page load
      js$disableTab("tab2")
      
      observeEvent(input$btn, {
        ## Enable tab2 when clicking the button
        shinyjs::js$enableTab("tab2") ## On a tab's title
        ## Switch to tab2
        updateNavbarPage(session, "navbarid", "tab2") ## On navbar's id, tab's title
        #### Taking it further: 
        ## Also disable tab1 as a selection
        shinyjs::js$disableTab("tab1")
      })
    }
    shinyApp(ui = ui, server = server)
    
    
    0 讨论(0)
  • 2020-12-03 13:21

    You need a bit of javascript to do this. Here's a solution using shinyjs. I also included some css to make it clear when the tab is disabled

    jscode <- "
    shinyjs.disableTab = function(name) {
      var tab = $('.nav li a[data-value=' + name + ']');
      tab.bind('click.tab', function(e) {
        e.preventDefault();
        return false;
      });
      tab.addClass('disabled');
    }
    
    shinyjs.enableTab = function(name) {
      var tab = $('.nav li a[data-value=' + name + ']');
      tab.unbind('click.tab');
      tab.removeClass('disabled');
    }
    "
    
    css <- "
    .nav li a.disabled {
      background-color: #aaa !important;
      color: #333 !important;
      cursor: not-allowed !important;
      border-color: #aaa !important;
    }"
    
    library(shiny)
    library(shinyjs)
    runApp(list(
      ui = fluidPage(
        useShinyjs(),
        extendShinyjs(text = jscode),
        inlineCSS(css),
        tabsetPanel(
          id = "navbar",
          tabPanel(title = "tab1", id = "tab1",
                   br(),
                   actionButton("btn", label = "View tab2 panel")),
          tabPanel(title = "tab2", id = "tab2")
        )
      ),
      server = function(input, output, session) {
    
        # disable tab2 on page load
        js$disableTab("tab2")
    
        observeEvent(input$btn, {
          # enable tab2 when clicking the button
          js$enableTab("tab2")
          # switch to tab2
          updateTabsetPanel(session, "navbar", "tab2")
        })
      }
    ))
    

    You could also put the javascript in a separate file and use extendShinyjs(file = ...) instead of extendShinyjs(text = ...).

    0 讨论(0)
提交回复
热议问题