如何确保Shiny中的textInput只接受数字值?

问题描述

我不想使用numericinput(),那么还有另一种方法可以解决此问题吗?另外,我尝试限制字符数,该错误消息有效,但是updateTextinput()不起作用(应该将原始输入限制为5个字符)。任何帮助将不胜感激!

app <- shinyApp(
  ui <- fluidPage(
    
  textInput("zipcode",label="Please enter your zipcode.",value = 66101)
                  ),server <- function(input,output,session) {
    
    observeEvent(input$zipcode,{ #limits zipcode input to 5 numbers only
      if(nchar(input$zipcode)>5 )
      {
        updateTextInput(session,'zipcode',value=substr(input$mytext,1,5))
        showModal(modalDialog(
          title = "Error!","Character limit exceeded!",easyClose = TRUE
        ))
      }
    }
    )
  }
)

解决方法

您错误地使用了input$mytext
试试:

app <- shinyApp(
  ui <- fluidPage(
    
    textInput("zipcode",label="Please enter your zipcode.",value = 66101)
  ),server <- function(input,output,session) {
    
    observeEvent(input$zipcode,{ #limits zipcode input to 5 numbers only
      cat(suppressWarnings(is.na(as.numeric(input$zipcode))),'\n')
      if(nchar(input$zipcode)>5)
      {
        updateTextInput(session,'zipcode',value=substr(input$zipcode,1,5))
        showModal(modalDialog(
          title = "Error!","Character limit exceeded!",easyClose = TRUE
        ))
      }
      if(is.na(as.numeric(input$zipcode)))
      {
          showModal(modalDialog(
          title = "Error!","Shoud be a digit",easyClose = TRUE
        ))
      }
    }
    )
  }
)

shinyApp(ui=ui,server)
,

Regex应该可以解决问题。这只是检查是否所有东西都不是数字:

grepl('[^0-9]',input$zipcode)

例如,

> grepl('[^0-9]','12345')
# [1] FALSE
> grepl('[^0-9]','words')
# [1] TRUE
> grepl('[^0-9]','wordsandnumber123')
# [1] TRUE

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...