Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何控制selectizeInput中输入的值,确保它们属于预先定义的列表?_R_Shiny_Onblur_Selectize.js - Fatal编程技术网

R 如何控制selectizeInput中输入的值,确保它们属于预先定义的列表?

R 如何控制selectizeInput中输入的值,确保它们属于预先定义的列表?,r,shiny,onblur,selectize.js,R,Shiny,Onblur,Selectize.js,我希望当用户退出selectizeInput字段(在selectizeInput之外单击)时,会创建并选择一个新选项(option createOnBlur=TRUE),但我不知道如何控制创建的值以确保它们属于“选项”列表 事实上,我希望createOnBlur=TRUE使用create=FALSE,但这显然不起作用 我看过selectize.js文档,我认为createFilter和/或onBlur()选项可能有用,但我没有成功地实现它 这是一个带有年龄输入的reprex,我希望当用户磁带如“

我希望当用户退出selectizeInput字段(在selectizeInput之外单击)时,会创建并选择一个新选项(option createOnBlur=TRUE),但我不知道如何控制创建的值以确保它们属于“选项”列表

事实上,我希望createOnBlur=TRUE使用create=FALSE,但这显然不起作用

我看过selectize.js文档,我认为createFilter和/或onBlur()选项可能有用,但我没有成功地实现它

这是一个带有年龄输入的reprex,我希望当用户磁带如“40”,然后在输入之外点击而不按“Enter”(即onBlur)时,值40会记录在输入中,但如果用户磁带如“444”,则不会在选项列表中创建此不可能的年龄值:

library(shiny)

input_age <- function(mina = 0, maxa =100){
  
  selectizeInput(inputId = "age", 
                 label = "Age",
                 choices = c("choose one" = "", mina:maxa),
                 options = list(create = TRUE,
                                createOnBlur = TRUE)
                 
  ) 
  
}

ui <- shinyUI(fluidPage(
  
  titlePanel("selectize createonblur"),
  
  mainPanel(
    input_age(mina = 20, maxa = 70)
  ) 

))

# SERVER
server <- shinyServer(function(input, output) {
})

shinyApp(ui, server)
库(闪亮)

input_age您可以使用
updateSelectizeInput
检查每次与输入交互后所做的选择

请参见以下内容:

library(shiny)

input_age <- function(mina = 0, maxa = 100){
  
  selectizeInput(inputId = "age", 
                 label = "Age",
                 choices = c("choose one" = "", mina:maxa),
                 options = list(create = TRUE,
                                createOnBlur = TRUE)
                 
  ) 
  
}

minAge <- 20
maxAge <- 70

ui <- shinyUI(fluidPage(
  
  titlePanel("selectize createonblur"),
  
  mainPanel(
    input_age(mina = minAge, maxa = maxAge)
  ) 
  
))

# SERVER
server <- shinyServer(function(input, output, session) {
  observeEvent(req(input$age), {
    if(length(setdiff(input$age, as.character(seq(minAge, maxAge)))) > 0){
      updateSelectizeInput(session,
                           inputId = "age",
                           choices = seq(minAge, maxAge),
                           selected = "")  
    }
  })
  
})

shinyApp(ui, server)
库(闪亮)

输入\u age您可以向
createFilter
选项提供正则表达式。如果用户键入的内容与此正则表达式不匹配,则“添加…”将不会出现,并且无法添加此项

library(shiny)

ui <- fluidPage(
  titlePanel("selectize createonblur"),
  mainPanel(
    selectizeInput(
      inputId = "age", 
      label = "Age",
      choices = c("choose one" = "", 20:70),
      options = list(
        create = TRUE,
        createOnBlur = TRUE,
        createFilter = I("/^([2-6][0-9]|70)$/")
      )
    ) 
  ) 
)

server <- function(input, output, session) {}

shinyApp(ui, server)
库(闪亮)

ui感谢您在服务器端提供此解决方案!你知道是否有办法在ui端实现相同的解决方案,例如使用“onblur()”或createfilter选项吗?Hi@Stéphanelant刚刚尝试了上面的代码-我仍然可以添加“444”作为选项。是的,我认为这是因为字符串“44”包含在“444”中。实际上,您不能添加'112',但可以添加'120',因为存在与'20'匹配的项。。。更糟糕的行为:你可以添加“44任何东西”!但无论如何,非常感谢你们两位的回答@Youenn抱歉,适当的正则表达式是
I(“/^([2-6][0-9]|70)$/”
。太好了,谢谢!我真的需要提高我的正则表达式技能。
library(shiny)

ui <- fluidPage(
  titlePanel("selectize createonblur"),
  mainPanel(
    selectizeInput(
      inputId = "age", 
      label = "Age",
      choices = c("choose one" = "", 20:70),
      options = list(
        create = TRUE,
        createOnBlur = TRUE,
        createFilter = I("/^([2-6][0-9]|70)$/")
      )
    ) 
  ) 
)

server <- function(input, output, session) {}

shinyApp(ui, server)