2016-11-17 168 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