Shiny 模块的命名空间 ('ns') 问题:CheckboxInput 未按预期运行

Namespace ('ns') Issue with Shiny Modules: CheckboxInput Not Behaving as Expected

提问人:Jojostack 提问时间:9/2/2023 更新时间:9/2/2023 访问量:28

问:

在我提供的模块外部示例中,一切顺利。但是,当我尝试将命名空间 (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)
R 闪亮 的模块 命名空间

评论

0赞 Limey 9/2/2023
in 是一个 JavaScript 表达式。它不知道 Shiny 命名空间,因此您需要手动添加它们。就个人而言,我会改用。 看起来很奇怪。你是说吗?conditionconditionalPaneluiOutputcheckboxInput(("addArguments"), "Arguments")checkboxInput(ns("addArguments"), "Arguments")
0赞 Jojostack 9/2/2023
这正是我觉得奇怪的地方。如果你在addArgumets中使用ns,它就不再起作用了。您有关于 uiOutput 的任何链接或建议吗?

答:

1赞 Limey 9/2/2023 #1

您的代码存在几个问题。您没有在主服务器函数中引用模块服务器(因此 Shiny 会“优化”它);您定义了两次,并且不向其传递模块 ID。但最根本的问题是,你没有使用 of 这个参数来帮助 JavaScript 解决命名空间问题。checkboxConditionalnsconditionalPanel

这似乎为您提供了您想要的东西,尽管它与您的非模块 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) {}
  )
}

[而且,就我个人而言,我会重命名为 .]checkboxConditionalcheckboxConditionalServer

基于的解决方案可能如下所示: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
工作完美,第二个是我一直在寻找的!