2017-09-12 28 views
1

我找不到在嵌套的UI模块中使用renderText中的输出变量的方法。如何更正嵌套闪亮模块中renderText的命名空间?

问题出现在我试图抓住选项卡的名称并将其放在我的navbarPage布局的标题标题中。

我找不到解决我的问题的答案解释如何处理renderUI(xxInput())通过session$nslike this one。由于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

到“激活标签”的参考工作在主面板,而不是在模块创建的报头。如果我使用textOutput(ns("tab-name"))(如上所述),则只会创建一个空的div <div id="mainUI-header-tab-name" class="shiny-text-output shiny-bound-output"></div>。如果我使用textOutput("tab-name"),主面板也会变空。

回答

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在不HTML文件,因此not valid in shiny有效的UI出现了两次。如果输出是在模块内定义的,事情会变得更加复杂。

备注:我会避免含有像一个tab-name负号的ID,因为-被用作已经模块分隔符。此外,语法output$tab-name将抛出错误,如object "name" not found

+0

原来我实际上只试着保留一个'textOutput',但只保留'headerPanel'中的'ns(“tab-name”)'不起作用(不需要'ns')。非常感谢您的回答和附加说明,它很有用! – xav