2016-11-17 164 views
0

我的闪亮应用程序以checkboxGroupInput开头,其中包含三家公司的名称:ABC。它还有3个hidden数字输入,每个对应一个公司。潜在投资者可以选择他们希望投资的公司的名称,并指定他们愿意投资的金额。当检查公司的名称时,显示相应的数字输入。另外,当公司名称未选中时,数字输入消失。显示和隐藏基于复选框的输入GroupGroupInput

checkboxGroupInput被称为company。该3 numericInput字段分别被称为amountA,amountBamountC,并且全部在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,就不能通过取消选中框来隐藏它。我该如何处理?

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

回答

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) 
+0

我颠倒了'if'语句和'for'循环,并且感谢您明确了为什么使用'observe'而不是'observeEvent'。 – SavedByJESUS