如何在嵌套的闪亮模块中更正renderText的命名空间?

时间:2017-09-12 15:05:16

标签: r shiny

我找不到在嵌套UI模块中renderText中使用输出变量的方法。

当我尝试获取选项卡的名称并将其放在我的navbarPage布局的标题标题中时出现了问题。

我在解答如何通过renderUI(xxInput()) like this one处理session$ns的答案中找不到我的问题的解决方法。由于renderText没有id参数,我不知道这是否适用。

最小例子:

library(shiny)

header_module <- function(id, label="My Header") {
  ns <- NS(id)
  headerPanel(
    div(
      h2("Some text", shiny::br()),
      #h2(textOutput("tab-name")),
      h2(textOutput(ns("tab-name"))),
      h2("Some more static text")
    )
  )
}

ui <- function(id, label="Main UI") {
  ns <- NS(id)
  navbarPage(title = "My app", 
             tabPanel(title = "My tab 1", 
                      pageWithSidebar(
                        header_module(ns("header")),
                        sidebarPanel(h2("Sidebar")),
                        mainPanel(h2("Main Panel"),
                                  textOutput("tab-name"))),
                      value = "Tab1"),
             id = ns("active-tab"))
}

server <- function(input, output, session) {
  output[["tab-name"]] <- renderText({ input[["mainUI-active-tab"]] })

}

shinyApp(ui=ui("mainUI"),server=server)

enter image description here

对&#34; active-tab&#34;的引用在主面板中工作,而不是在模块创建的头中。如果我使用textOutput(ns("tab-name"))(如上所述),则只会创建一个空div <div id="mainUI-header-tab-name" class="shiny-text-output shiny-bound-output"></div>。如果我使用textOutput("tab-name"),主面板也会变空。

1 个答案:

答案 0 :(得分:1)

您的代码中的问题似乎无需对模块执行任何操作。这是一个固定版本:

library(shiny)

header_module <- function(id, label="My Header") {
  ns <- NS(id)
  headerPanel(
    div(
      h2("Some text", shiny::br()),
      h2(textOutput("tab-name2")),
      #h2(textOutput(ns("tab-name2"))),
      h2("Some more static text")
    )
  )
}

ui <- function(id, label="Main UI") {
  ns <- NS(id)
  navbarPage(title = "My app", 
             tabPanel(title = "My tab 1", 
                      pageWithSidebar(
                        header_module(ns("header")),
                        sidebarPanel(h2("Sidebar")),
                        mainPanel(h2("Main Panel"),
                                  textOutput("tab-name"))),
                      value = "Tab1"),
             id = ns("active-tab"))
}

server <- function(input, output, session) {
  output[["tab-name"]] <- renderText({ input[["mainUI-active-tab"]] })
  output[["tab-name2"]] <- renderText({ input[["mainUI-active-tab"]] })

}

shinyApp(ui=ui("mainUI"),server=server)

问题是输出ID tab-name在UI中出现两次,在HTML文档中无效,因此not valid in shiny。如果在模块中定义输出,事情会变得更加复杂。

备注:我会避免使用包含tab-name等减号的ID,因为-已用作模块的分隔符。此外,语法output$tab-name会抛出object "name" not found等错误。