一旦用户在 R shiny 中选择了多个选项,就禁用 selectinput
Disable selectinput once user selected multiple choices in R shiny
我有一个 select 多个输入 = TRUE,我需要在用户 select 多个选择后禁用 select 输入。但是,一旦我 select 第一选择,select 输入就被禁用,它不允许我 select 第二选择。我使用了以下代码。
library(shiny)
library(shinyjs)
ui <- fluidPage(
br(),
useShinyjs(),
fluidRow(
column(
width = 6,
selectInput(inputId = "check1", label = "Choose", choices = c("choice A","choice B","choice C"),multiple = T),
verbatimTextOutput(outputId = "res1")
)
)
)
server <- function(input, output, session) {
flag_lifecycle <- reactiveValues(val = "Yes")
output$res1 <- renderPrint({
input$check1
})
observeEvent(input$check1, {
shinyjs::disable("check1")
})
}
shinyApp(ui = ui, server = server)
我得到的输出
这里,select只有在select编辑了多项选择后才应该禁用输入。
在此感谢任何帮助。提前致谢!
在当前设置中,您实际上不知道用户何时完成 selection。
考虑各种场景-
- 如果您在第一个 selection 后禁用,则用户无法 select 2 或 3 个值。
- 如果您在第 2 个 selection 后禁用,则用户无法 select 3 个值。
- 如果您在第 3 次之后禁用,那么如果用户只想 select 1 个值怎么办?
您永远不会知道何时根据值的长度禁用。我认为更好的选择是提供 actionButton
供用户在完成 selection 后提交。
library(shiny)
library(shinyjs)
ui <- fluidPage(
br(),
useShinyjs(),
fluidRow(
column(
width = 6,
selectInput(inputId = "check1", label = "Choose",
choices = c("choice A","choice B","choice C"), multiple = T),
verbatimTextOutput(outputId = "res1"),
actionButton('submit', 'Done')
)
)
)
server <- function(input, output, session) {
flag_lifecycle <- reactiveValues(val = "Yes")
output$res1 <- renderPrint({
input$check1
})
observeEvent(input$submit, {
shinyjs::disable("check1")
})
}
shinyApp(ui = ui, server = server)
使用selectizeInput()
.
下面的函数为您的 selectizeInput()
添加了 2 个功能:
- 能够删除已经做出的选择。
- 限制可以选择的最大项目数。
# ----selectizeInput options---
selectizeOptions <- function (n = NULL) { # n is the max number of items
if (is.null(n)) {
list(
plugins = list("remove_button")
)
}else {
list(
plugins = list("remove_button"),
maxItems = n
)
}
}
这是一个例子:
library(shiny)
ui <- fluidPage(
# ----selections here----
selectizeInput(
inputId = "thechoices",
label = "Choose",
choices = LETTERS,
selected = "A",
multiple = TRUE,
options = selectizeOptions(n = 4)
)
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
我有一个 select 多个输入 = TRUE,我需要在用户 select 多个选择后禁用 select 输入。但是,一旦我 select 第一选择,select 输入就被禁用,它不允许我 select 第二选择。我使用了以下代码。
library(shiny)
library(shinyjs)
ui <- fluidPage(
br(),
useShinyjs(),
fluidRow(
column(
width = 6,
selectInput(inputId = "check1", label = "Choose", choices = c("choice A","choice B","choice C"),multiple = T),
verbatimTextOutput(outputId = "res1")
)
)
)
server <- function(input, output, session) {
flag_lifecycle <- reactiveValues(val = "Yes")
output$res1 <- renderPrint({
input$check1
})
observeEvent(input$check1, {
shinyjs::disable("check1")
})
}
shinyApp(ui = ui, server = server)
我得到的输出
这里,select只有在select编辑了多项选择后才应该禁用输入。
在此感谢任何帮助。提前致谢!
在当前设置中,您实际上不知道用户何时完成 selection。
考虑各种场景-
- 如果您在第一个 selection 后禁用,则用户无法 select 2 或 3 个值。
- 如果您在第 2 个 selection 后禁用,则用户无法 select 3 个值。
- 如果您在第 3 次之后禁用,那么如果用户只想 select 1 个值怎么办?
您永远不会知道何时根据值的长度禁用。我认为更好的选择是提供 actionButton
供用户在完成 selection 后提交。
library(shiny)
library(shinyjs)
ui <- fluidPage(
br(),
useShinyjs(),
fluidRow(
column(
width = 6,
selectInput(inputId = "check1", label = "Choose",
choices = c("choice A","choice B","choice C"), multiple = T),
verbatimTextOutput(outputId = "res1"),
actionButton('submit', 'Done')
)
)
)
server <- function(input, output, session) {
flag_lifecycle <- reactiveValues(val = "Yes")
output$res1 <- renderPrint({
input$check1
})
observeEvent(input$submit, {
shinyjs::disable("check1")
})
}
shinyApp(ui = ui, server = server)
使用selectizeInput()
.
下面的函数为您的 selectizeInput()
添加了 2 个功能:
- 能够删除已经做出的选择。
- 限制可以选择的最大项目数。
# ----selectizeInput options---
selectizeOptions <- function (n = NULL) { # n is the max number of items
if (is.null(n)) {
list(
plugins = list("remove_button")
)
}else {
list(
plugins = list("remove_button"),
maxItems = n
)
}
}
这是一个例子:
library(shiny)
ui <- fluidPage(
# ----selections here----
selectizeInput(
inputId = "thechoices",
label = "Choose",
choices = LETTERS,
selected = "A",
multiple = TRUE,
options = selectizeOptions(n = 4)
)
)
server <- function(input, output, session) {
}
shinyApp(ui, server)