2017-09-06 5 views
1

特定のオブジェクトをクリックしたときにタブを切り替えることができるアプリケーションを作成しようとしています。しかし、私はモジュールを使用してアプリを開発しており、これを継続したいと考えています。モジュールの内側からupdateNavbarPage()関数を呼び出そうとしたときにスコープに関する問題に遭遇しています。問題を説明するためにMWEの例を作成しました。shinyモジュール内からupdateNavbarPage()関数のスコープが問題になる

#================================================== 
# 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) 

このアプリケーションを実行すると、最初のタブでアクションボタンがクリックされても何も起こりません。ただし、モジュールを削除して、uiおよびサーバーモジュールのコードをuiおよびサーバーの部分に直接配置し、ボタンをクリックすると機能します。ここに、モジュールが削除されたコードがあります。

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) 

モジュールではないにあるタブに切り替えるには、モジュール内からupdateNavbarPage()を使用する方法はありますか?

答えて

1

はなぜ:-)私に聞かないでください、それは次のように動作します。

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

感謝を!これは奇妙な動作のようですが、確かに私の問題を解決します! – tbradley

関連する問題