提问人:Jojostack 提问时间:9/2/2023 更新时间:9/2/2023 访问量:28
Shiny 模块的命名空间 ('ns') 问题:CheckboxInput 未按预期运行
Namespace ('ns') Issue with Shiny Modules: CheckboxInput Not Behaving as Expected
问:
在我提供的模块外部示例中,一切顺利。但是,当我尝试将命名空间 (ns) 添加到模块内的复选框时,它似乎会导致问题。我需要在我的应用程序中创建一个模块,我担心没有自己的命名空间可能会导致更复杂的应用程序出现问题。
library(shiny)
ui <- fluidPage(
titlePanel("Checkbox and Conditional Panel Example"),
sidebarLayout(
sidebarPanel(
checkboxInput("addArguments", "Arguments"),
conditionalPanel(
condition = "input.addArguments",
textInput("customArguments", "Add custom arguments:")
)
),
mainPanel(
h4("Content:"),
verbatimTextOutput("contentOutput")
)
)
)
server <- function(input, output) {
output$contentOutput <- renderText({
if (input$addArguments) {
paste("Checkbox 'Arguments' is selected. Custom Arguments:", input$customArguments)
} else {
"Checkbox 'Arguments' is not selected."
}
})
}
shinyApp(ui, server)
第二个示例未按预期工作
library(shiny)
checkboxConditionalUI <- function(id) {
ns <- NS(id)
tagList(
checkboxInput(("addArguments"), "Arguments"),
conditionalPanel(
condition = "input.addArguments",
textInput(inputId = ns("customArguments"),label = "Add custom arguments"
)
)
)
}
checkboxConditional <- function(input, output, session) {
}
ui <- fluidPage(
titlePanel("Checkbox and Conditional Panel Module Example"),
checkboxConditionalUI("myModule1"),
)
checkboxConditional <- function(input, output, session) {
}
shinyApp(ui, server)
答:
1赞
Limey
9/2/2023
#1
您的代码存在几个问题。您没有在主服务器函数中引用模块服务器(因此 Shiny 会“优化”它);您定义了两次,并且不向其传递模块 ID。但最根本的问题是,你没有使用 of 这个参数来帮助 JavaScript 解决命名空间问题。checkboxConditional
ns
conditionalPanel
这似乎为您提供了您想要的东西,尽管它与您的非模块 UI 不同:
ibrary(shiny)
checkboxConditionalUI <- function(id) {
ns <- NS(id)
tagList(
checkboxInput(ns("addArguments"), "Arguments"),
conditionalPanel(
condition = "input.addArguments",
ns = ns,
textInput(inputId = ns("customArguments"), label = "Add custom arguments")
)
)
}
checkBoxConditional <- function(id) {}
ui <- fluidPage(
titlePanel("Checkbox and Conditional Panel Module Example"),
checkboxConditionalUI("myModule1"),
)
server <- function(input, output, session) {
checkBoxConditional("myModule1")
}
shinyApp(ui, server)
当前最好的 ptactice 建议您应该像这样定义模块服务器:
checkBoxConditional <- function(id) {
moduleServer(
id,
function(input, output, session) {}
)
}
[而且,就我个人而言,我会重命名为 .]checkboxConditional
checkboxConditionalServer
基于的解决方案可能如下所示:outputUI
library(shiny)
checkboxConditionalUI <- function(id) {
ns <- NS(id)
tagList(
checkboxInput(ns("addArguments"), "Arguments"),
uiOutput(ns("customArgumentsUI"))
)
}
checkBoxConditional <- function(id) {
moduleServer(
id,
function(input, output, session) {
ns <- session$ns
output$customArgumentsUI <- renderUI({
if (input$addArguments) {
textInput(inputId = ns("customArguments"), label = "Add custom arguments")
}
})
}
)
}
ui <- fluidPage(
titlePanel("Checkbox and Conditional Panel Module Example"),
checkboxConditionalUI("myModule1"),
)
server <- function(input, output, session) {
checkBoxConditional("myModule1")
}
shinyApp(ui, server)
我希望这会有所帮助。祝你好运!
评论
0赞
Jojostack
9/2/2023
工作完美,第二个是我一直在寻找的!
评论
condition
conditionalPanel
uiOutput
checkboxInput(("addArguments"), "Arguments")
checkboxInput(ns("addArguments"), "Arguments")