2017-07-20 3 views
1

J'utilise des modules dans mon application brillante pour afficher le contenu de différents tabPanels. J'aimerais pouvoir accéder au second onglet en cliquant sur un bouton. J'ai le code suivant:Comment s'assurer que l'application brillante sait quel onglet est actuellement ouvert lors de l'utilisation des modules?

library(shiny) 
library(shinydashboard) 

moduleUI <- function(id){ 

    ns <- NS(id) 
    sidebarPanel(
    actionButton(ns("action1"), label = "Go to tab 2") 
) 
} 

module <- function(input, output, session, openTab){ 

    observeEvent(input$action1, { 
    openTab("two") 
    }) 

    return(openTab) 
} 

ui <- fluidPage(
    navlistPanel(id = "tabsPanel", 
       tabPanel("one", moduleUI("first")), 
       tabPanel("two", moduleUI("second")) 
)) 

server <- function(input, output, session){ 
    openTab <- reactiveVal() 
    openTab("one") 

    openTab <- callModule(module,"first", openTab) 
    openTab <- callModule(module,"second", openTab) 

    observeEvent(openTab(), { 
    updateTabItems(session, "tabsPanel", openTab()) 
    }) 
} 

shinyApp(ui = ui, server = server) 

Cependant, cela ne fonctionne qu'une seule fois. Le problème, je pense, est que le module ne sait pas quand un onglet est modifié dans l'application. Par conséquent je cherche un moyen de m'assurer que le module sait quel onglet est ouvert de sorte que le bouton d'action fonctionne plus qu'une fois. J'ai envisagé d'utiliser l'entrée $ tabsPanel mais je ne sais pas comment l'implémenter. L'aide serait grandement appréciée.

+0

vous pouvez joindre votre '' l'intérieur tabPanel' div' et attribuer un identifiant à 'div', de cette façon, vous pouvez savoir qui' tab' on accède – parth

Répondre

1

Le problème est qu'une fois que l'utilisateur revient manuellement à l'onglet 1, le openTab() n'est pas mis à jour. Par conséquent, lorsque vous cliquez une seconde fois sur le bouton d'action, openTab passe de "deux" à "deux" (c'est-à-dire qu'il reste le même), et par conséquent votre observEvénement n'est pas déclenché.

Vous pouvez ajouter:

observeEvent(input$tabsPanel,{ 
    openTab(input$tabsPanel) 
    }) 

Ainsi, le openTab reactiveVal est également mis à jour lorsqu'un utilisateur modifie manuellement au tab1 (ou tout autre onglet).


Vous n'avez pas besoin de modules pour faire ce que vous voulez en passant, mais je suppose que vous avez une raison particulière de les utiliser. Pour toute autre personne qui veut obtenir le même, mais n'a pas besoin de modules:

library(shiny) 
library(shinydashboard) 

ui <- fluidPage(
    sidebarPanel(
    actionButton(ns("action1"), label = "Go to tab 2")), 
    navlistPanel(id = "tabsPanel", 
       tabPanel("one"), 
       tabPanel("two") 
)) 

server <- function(input, output, session){ 
    observeEvent(input$action1, { 
    updateTabItems(session, "tabsPanel", "two") 
    }) 
} 

shinyApp(ui = ui, server = server) 
+0

Merci beaucoup Florian! Cela aide beaucoup! Oui, en effet, ce n'était qu'un exemple pour illustrer mon problème et pas mon application réelle. – MaxPlank