在闪亮模块中使用updateNavbarPage()函数确定范围问题

时间:2017-09-06 12:25:12

标签: r module shiny

我正在尝试构建一个应用程序,用户可以在单击特定对象时切换选项卡。但是,我使用模块开发了应用程序,并希望继续这样做。尝试从模块内部调用updateNavbarPage()函数时,我遇到了范围问题。我创建了一个MWE示例来说明问题。

#==================================================
# 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 个答案:

答案 0 :(得分:2)

不要问我为什么:-)但它的工作原理如下:

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