我找不到在嵌套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)
对&#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")
,主面板也会变空。
答案 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
等错误。