闪亮模块的命名空间('ns')问题:CheckboxInput 的行为不符合预期

问题描述 投票:0回答:1

在我提供的模块外部示例中,一切顺利。但是,当我尝试将命名空间(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 shiny module namespaces
1个回答
0
投票

您的代码存在几个问题。您没有在主服务器功能中引用模块服务器(因此Shiny“优化”了它);您定义

checkboxConditional
两次,并且不向其传递模块 ID。但根本问题是你没有使用
ns
conditionalPanel
参数来帮助 JavaScript 解决命名空间问题。

这似乎给了你你想要的,尽管它与你的非模块 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)

当前最佳策略建议您应该像这样定义模块服务器:

checkBoxConditional <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {}
  )
}

基于

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)

我希望有帮助。祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.