Ограничить тип ввода в блестящем поле

Как это, numericInput принимает как строковые, так и числовые данные. Если строка введена, она преобразуется в NA (попробуйте с кодом ниже). Есть ли способ запретить пользователю вводить строку в числовое поле в блестящем?

ui <- fluidPage(
  numericInput("num", label = "text not allowed", value = 1),
  verbatimTextOutput("value")
)

server <- function(input, output) {
  output$value <- renderPrint({ input$num })      
}

shinyApp(ui = ui, server = server)

До сих пор я добавил текстовый вывод рядом с числовым вводом, который предупреждает пользователя о том, что принимаются только цифры, если она вводит строку в numericInput поле. Это решение далеко не идеально для меня.

Я хочу, чтобы пользователь не мог ввести символьное значение в числовое поле.

4 ответа

Решение

Можете добавить validate к вашему выражению, поэтому будут разрешены только числовые входы. Я использую 64-битную Windows 7 с Google Chrome (IE тоже будет работать)

Примечание: блестящая версия 0.13.2, не работает на Firefox.

rm(list = ls())
library(shiny)
ui <- fluidPage(
  numericInput("num", label = "text not allowed", value = 1),
  verbatimTextOutput("value")
)
server <- function(input, output) {

  numbers <- reactive({
    validate(
      need(is.numeric(input$num), "Please input a number")
    )
  })
  output$value <- renderPrint({ numbers() })      
}
shinyApp(ui = ui, server = server)

Вот решение, использующее HTML, а не Shiny. Решение состоит в том, чтобы добавить атрибут к тегу ввода HTML. Он не удалит нежелательные символы, но поле станет, скажем, розовым, чтобы пользователь знал, что введен недопустимый символ.

1- Пусть фон станет розовым при поднятии недействительности. Для этого нам нужно добавить стиль в CSS. В Shiny это достигается путем добавления в пользовательский интерфейс style тег в head тег, который будет прикреплен к input[type='text']:invalid с участием

      tags$head(
    tags$style(HTML("input[type='text']:invalid {background-color: pink;}"))
)

2 - создайте пользовательский интерфейс с указанным выше, а также с полем ввода текста, например:

      ui <- fluidPage(
    tags$head(
        tags$style(HTML("input[type='text']:invalid {background-color: pink;}"))
      ),
  textInput("mySolution", label = "Only letters are valid here", value = ""),
)

3 - измените этот интерфейс, чтобы добавить pattern к входному тегу:

      ui <- searchreplaceit(ui, "input", list(id="mySolution"), 
        "input", list(pattern="[A-Za-z]*"), replace=FALSE)

Это оно! серверной функции ничего не нужно, так как проверка выполняется внутри страницы. Запустить страницу с

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

Здесь представлена ​​функция добавления атрибутов к тегу.

      searchreplaceit <- function(branch, whattag, whatattribs, totag, toattribs, replace=TRUE) {
    if ("name" %in% names(branch)) {
        if ((branch$name == whattag)&&(identical( branch$attribs[names(whatattribs)], whatattribs))) {
            branch$name    <- totag
            branch$attribs <- if (replace) {toattribs} else { modifyList(branch$attribs, toattribs)}
        }
    }
    if ("shiny.tag" %in% class(branch)) {
        if (length(branch$children)>0) for (i in 1: length(branch$children)) {
            if (!(is.null(branch$children[[i]]))) {
                branch$children[[i]] = searchreplaceit(branch$children[[i]], whattag, whatattribs, totag, toattribs, replace)
        } }
    } else if ("list" %in% class(branch)) {
        if (length(branch)>0) for (i in 1:length(branch) ) {
            if (!(is.null(branch[[i]]))) {
                branch[[i]] <- searchreplaceit(branch[[i]], whattag, whatattribs, totag, toattribs, replace)
        } }
    } 
    return(branch)
}

Соответствующая версия была указана в элементе Edit a shiny.tag.

Когда вы не набираете письмо:

IMO - самый простой способ сделать это, добавив наблюдателя к вашему входу, и, когда запрещенный знак обнаружен (что, вероятно, требует, чтобы ваша собственная функция обнаруживала запрещенные знаки), просто удалите его из формы ввода, используя функцию updateInput.

Обновить:

observe({

if(is.null(input$myTextInput)) {
  vec <- NULL
  return()
} else vec <- input$myTextInput

  vec <- removeForbiddenSignsFunction(vec)

  updateTextInput(session, "myTextInput", value = vec)
})

Пример удаления функции запрещенных знаков (эта функция удаляет знаки, запрещенные в именах файлов Windows):

  removeForbiddenSignsFunction <- function(vec) {
  forbidden <- c("|", "?", "*")
  notAllowed <- c(">", "<", ":","/"," ")


  for(i in 1:length(forbidden)) {
    if(grepl(paste0("\\",forbidden[i]),vec)) {
      vec <- sub(paste0("\\",forbidden[i]),"",vec)
    }
  }

  for(i in 1:length(notAllowed)) {
    if(grepl(notAllowed[i],vec)) {
      vec <- sub(notAllowed[i],"",vec)
    }
  }

  if(grepl("\\\\",vec)) vec <- sub("\\\\","",vec)
  if(grepl("\"",vec)) vec <- sub("\"","",vec)

  return(vec)
}

Он разделен на запрещенные и недопустимые из-за специальных символов регулярных выражений (недопустимо в регулярных выражениях и именах файлов Windows).

Мое решение было использовать observe() контролировать вход и заменить его, если он не соответствует требуемым параметрам, используя updateNumericInput(),

observe({
  if (!is.numeric(input$num)) {
    updateNumericInput(session, "num", 0)
  }
})
Другие вопросы по тегам