2017-07-18 12 views
2

モジュールを使用して別のタブのUIコンテンツを表示するアプリケーションを開発しています。しかし、モジュールがメイン(または親)アプリと通信していないようです。適切なUIを表示しますが、actionButtonがクリックされたときにobserveEvent関数を実行することはできません。現在のタブを更新し、2番目のタブを表示する必要があります。observeEventモジュールで使用されるシャイニー関数が機能しない

私のコードでは、名前空間関数を作成してactionButtonのIDをns()にラップしましたが、それでも動作しません。誰が何が間違っているのか分かっていますか?

library(shiny) 

moduleUI <- function(id){ 

    ns <- NS(id) 
     sidebarPanel(

     actionButton(ns("action1"), label = "click") 
    ) 
} 

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


    observeEvent(input$action1, { 
    updateTabItems(session, "tabsPanel", "two") 
    }) 
} 

ui <- fluidPage(

      navlistPanel(id = "tabsPanel", 

         tabPanel("one",moduleUI("first")), 
         tabPanel("two",moduleUI("second")) 
)) 
server <- function(input, output, session){ 
    callModule(module,"first") 
    callModule(module,"second") 

} 

shinyApp(ui = ui, server = server) 

答えて

3

observeEventは動作しますが、モジュールが唯一の入力パラメータとして彼らに与えられた変数を参照して知っているので、それはtabsetPanelは、指定されたので、それを更新することはできません知りません。この問題は、パラメーターとして渡され、モジュール内で変更されるリアクティブバリューを使用して解決できます。それが変わったのならば、それはメインのアプリに知っているとtabsetPanelを更新することができます。

library(shiny) 
library(shinydashboard) 

moduleUI <- function(id){ 

    ns <- NS(id) 
    sidebarPanel(
    actionButton(ns("action1"), label = "click") 
) 
} 

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

    observeEvent(input$action1, { 
    if(tabsPanel() == "one"){ # input$tabsPanel == "one" 
     openTab("two") 
    }else{      # input$tabsPanel == "two" 
     openTab("one") 
    } 
    }) 

    return(openTab) 
} 

ui <- fluidPage(
    h2("Currently open Tab:"), 
    verbatimTextOutput("opentab"), 
    navlistPanel(id = "tabsPanel", 
       tabPanel("one", moduleUI("first")), 
       tabPanel("two", moduleUI("second")) 
)) 


server <- function(input, output, session){ 
    openTab <- reactiveVal() 
    observe({ openTab(input$tabsPanel) }) # always write the currently open tab into openTab() 

    # print the currently open tab 
    output$opentab <- renderPrint({ 
    openTab() 
    }) 

    openTab <- callModule(module,"first", reactive({ input$tabsPanel }), openTab) 
    openTab <- callModule(module,"second", reactive({ input$tabsPanel }), openTab) 

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

shinyApp(ui = ui, server = server) 

enter image description here

+0

はあなたの助けのshosacoをありがとう、私は今何が起こっているのかをより良く理解しています。しかし、このソリューションは一度しか動作しないようです。ボタンをクリックして最初のタブに戻り、それを再度クリックしても何も起こりません。 – MaxPlank

+0

はい、それはほんの少しの例でしたが、開いているタブを「2」に変更してしまいました。それに応じて私の例を更新しましたトリック:モジュールに現在開いているタブ( '$ tabPanel'の入力)に関する情報を与えますが、これは反応的なものとしてラップする必要があります。私は' tabsPanel'と呼んでいます。モジュールは 'tabsPanel()'を呼び出すことによって常に開いているタブを知ることができます。ここで説明します:https://www.rstudio.com/resources/webinars/understanding-shiny-modules/(約42:15) – shosaco

+0

私のコードに入力$ tabsPanelを実装することができないので、アプリケーションは常に知っています。それはどのタブです。あなたの例では、ボタンを1回クリックしてから最初のタブに戻ると、ボタンを使用しないと、アプリケーションはあなたが新しいタブに入っていることを知らず、ボタンは機能しません。私は、どのタブが開いているかをいつでも知ることができるかどうかを知る方法を知らない。 – MaxPlank

関連する問題