2017-09-06 6 views
1

J'essaie de créer une application dans laquelle l'utilisateur peut changer d'onglet en cliquant sur un objet spécifique. Cependant, j'ai développé l'application en utilisant des modules et je voudrais continuer à le faire. Je rencontre un problème avec la portée lorsque j'essaie d'appeler la fonction updateNavbarPage() depuis l'intérieur des modules. J'ai créé un exemple MWE pour illustrer le problème.problème de portée avec la fonction updateNavbarPage() à partir du module brillant

#================================================== 
# MRE for updateNavBar scoping issue within modules 
#================================================== 

modOneUI <- function(id){ 
    ns <- NS(id) 

    tagList(
    h4(
     "Click this button to change tabs!" 
    ), 
    actionButton(
     ns("submit"), 
     label = "Go to next Tab" 
    ) 
) 
} 


modOne <- function(input, output, session){ 
    observeEvent(input$submit, { 
    updateNavbarPage(session, "nav-page", "tab2") 
    }) 
} 

ui <- shinyUI(
    navbarPage(
    id = "nav-page", 
    title = "Example Navbar Page Issue", 
    tabPanel(
     id = "tab1", 
     value = "tab1", 
     div(
     "Tab 1" 
    ), 
     div(
     modOneUI("tab1_mod") 
    ) 
    ), 
    tabPanel(
     id = "tab2", 
     value = "tab2", 
     div(
     "Tab 2" 
    ), 
     div(
     h4("This is the second tab") 
    ) 
    ) 
) 
) 


server <- shinyServer(function(input, output, session){ 
    callModule(modOne, "tab1_mod") 

}) 

shinyApp(ui = ui, server = server) 

Lorsque cette application est exécutée et que le bouton d'action est cliqué sur le premier onglet, rien ne se passe. Toutefois, si vous supprimez le module et placez le code du module serveur et de l'interface utilisateur directement dans les parties serveur et serveur, le fait de cliquer sur le bouton fonctionne. Voici le code avec les modules supprimés.

ui <- shinyUI(
    navbarPage(
    id = "nav-page", 
    title = "Example Navbar Page Issue", 
    tabPanel(
     id = "tab1", 
     value = "tab1", 
     div(
     "Tab 1" 
    ), 
     div(
     h4(
      "Click this button to change tabs!" 
     ), 
     actionButton(
      "submit", 
      label = "Go to next Tab" 
     ) 
    ) 
    ), 
    tabPanel(
     id = "tab2", 
     value = "tab2", 
     div(
     "Tab 2" 
    ), 
     div(
     h4("This is the second tab") 
    ) 
    ) 
) 
) 


server <- shinyServer(function(input, output, session){ 
    observeEvent(input$submit, { 
    updateNavbarPage(session, "nav-page", "tab2") 
    }) 

}) 

shinyApp(ui = ui, server = server) 

Est-il possible d'utiliser updateNavbarPage() à partir d'un module pour passer à un onglet qui est pas dans le module?

Répondre

1

Ne me demandez pas pourquoi :-) mais il fonctionne comme ceci:

modOne <- function(input, output, session, x){ 
    observeEvent(input$submit, { 
    updateNavbarPage(x, "nav-page", "tab2") 
    }) 
} 
callModule(modOne, "tab1_mod", x=session) 
+0

Merci! Cela a l'air d'un comportement étrange, mais cela règle certainement mon problème pour moi! – tbradley