基于 checkboxGroupInput 显示和隐藏输入

Showing and hiding inputs based on checkboxGroupInput

我闪亮的应用程序以 checkboxGroupInput 开头,其中包含三个公司的名称:ABC。它还有 3 个 hidden 个数字输入,每个对应一个公司。潜在投资者可以 select 他们希望投资的公司的名称并指定他们愿意投资的金额。选中公司名称时,会显示相应的数字输入。另外,取消选中公司名称时,数字输入会消失。

checkboxGroupInput被称为company。 3个numericInput字段分别叫做amountAamountBamountC,都是在一个uiOutput里面生成的。它们是用 shinyjshidden 函数隐藏的。

library(shiny)
library(shinyjs)
library(magrittr)

ui <- fluidPage(

  useShinyjs(),

  checkboxGroupInput(inputId = "company", label = "Select a company", choices = LETTERS[1:3]),

  uiOutput(outputId = "amounts")

)

server <- function(input, output){

  company_names <- LETTERS[1:3]
  num_ids <- paste0("amount", LETTERS[1:3])

  output$amounts <- renderUI({

    num_inputs <- lapply(1:3, function(i){
      numericInput(inputId = num_ids[i], label = paste0("Investment in ", company_names[i]), value = 0, min = 0, max = 5000)
    }) %>% tagList

    shinyjs::hidden(num_inputs)

  })

  observeEvent(eventExpr = input$company, handlerExpr = {

    if(length(input$company) == 0){
      for(i in num_ids){
        shinyjs::hide(id = i)
      }
    } else {
      for(i in input$company){
        shinyjs::toggle(id = paste0("amount", i), condition = input$company)
      }
    }
  })

}

shinyApp(ui = ui, server = server)

我的应用程序的问题是 checkboxGroupInputnumericInput 字段之间的预期动态没有按预期工作。例如,一旦 numericInput 显示,就不能再通过取消选中框来隐藏它。我该如何处理?

上面粘贴的代码功能齐全。非常感谢。

当相应的复选框为 selected/unselected 时,我通过 show/hide numericInput 显式修复了您的代码。此外,我将 observeEvent 更改为 observe 以确保观察者在选中 none 复选框时做出反应。

library(shiny)
library(shinyjs)
library(magrittr)

ui <- fluidPage(
  useShinyjs(),
  checkboxGroupInput(inputId = "company", label = "Select a company", choices = LETTERS[1:3]),
  uiOutput(outputId = "amounts")
)

server <- function(input, output){
  company_names <- LETTERS[1:3]
  num_ids <- paste0("amount", LETTERS[1:3])

  output$amounts <- renderUI({

    num_inputs <- lapply(1:3, function(i){
      numericInput(inputId = num_ids[i], label = paste0("Investment in ", company_names[i]), value = 0, min = 0, max = 5000)
    }) %>% tagList

    shinyjs::hidden(num_inputs)
  })

  observe({
    for(i in company_names){
      if (i %in% input$company) {
        shinyjs::show(id = paste0("amount", i))
      } else {
        shinyjs::hide(id = paste0("amount", i))
      }  
    }
  })

}

shinyApp(ui = ui, server = server)