基于 checkboxGroupInput 显示和隐藏输入
Showing and hiding inputs based on checkboxGroupInput
我闪亮的应用程序以 checkboxGroupInput
开头,其中包含三个公司的名称:A
、B
和 C
。它还有 3 个 hidden
个数字输入,每个对应一个公司。潜在投资者可以 select 他们希望投资的公司的名称并指定他们愿意投资的金额。选中公司名称时,会显示相应的数字输入。另外,取消选中公司名称时,数字输入会消失。
checkboxGroupInput
被称为company
。 3个numericInput
字段分别叫做amountA
、amountB
和amountC
,都是在一个uiOutput
里面生成的。它们是用 shinyjs
的 hidden
函数隐藏的。
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
字段之间的预期动态没有按预期工作。例如,一旦 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)
我闪亮的应用程序以 checkboxGroupInput
开头,其中包含三个公司的名称:A
、B
和 C
。它还有 3 个 hidden
个数字输入,每个对应一个公司。潜在投资者可以 select 他们希望投资的公司的名称并指定他们愿意投资的金额。选中公司名称时,会显示相应的数字输入。另外,取消选中公司名称时,数字输入会消失。
checkboxGroupInput
被称为company
。 3个numericInput
字段分别叫做amountA
、amountB
和amountC
,都是在一个uiOutput
里面生成的。它们是用 shinyjs
的 hidden
函数隐藏的。
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
字段之间的预期动态没有按预期工作。例如,一旦 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)