显示和隐藏基于checkboxGroupInput的输入

时间:2016-11-17 03:18:38

标签: r shiny shinyjs

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

checkboxGroupInput被称为company。 3个numericInput字段分别称为amountAamountBamountC,均在uiOutput内生成。它们隐藏在hidden的{​​{1}}函数中。

shinyjs

我的应用程序的问题是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) checkboxGroupInput字段之间的预期动态不按预期工作。例如,一旦显示numericInput,就不能通过取消选中框来隐藏它。我怎么处理这个?

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

1 个答案:

答案 0 :(得分:1)

当选中/取消选中相应的复选框时,我通过显式显示/隐藏numericInput来修复代码。此外,我使用observeEvent更改observe以确保观察者在未选中任何复选框时做出反应。

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)