Блестящий numericInput() не учитывает минимальное и максимальное значения

В Shiny, если у меня есть numericInput в качестве ввода, когда пользователь вводит значение вручную, он не распознает или не учитывает значение max/min и допускает любое число. Если пользователь выбирает стрелку для раскрывающегося списка, он уважает значения, но только не при вводе вручную. Как сделать так, чтобы ручной ввод учитывал верхние / нижние границы значений?

numericInput("test", label=("TestLabel"), min=0, max=10, value="", step = 1.0),

1 ответ

Решение

Как отметил @HubertL, это сообщенная ошибка.

Итак, у вас есть возможности:

  1. Принять небольшую работу вокруг, см. Ниже или
  2. Подождите, пока это будет исправлено

В случае, если вам нужен уродливый обходной путь, пока он не будет исправлен:

library(shiny)

ui <- fluidPage(
  uiOutput("numInput"),
  textOutput("text")
)

server <- function(input, output) {
  global <- reactiveValues(numVal = 25, numMin = 1, numMax = 100)

  numVal <- reactive({
    if(!is.null(input$num)){
      if(input$num < global$numMin) return(global$numMin)
      if(input$num > global$numMax) return(global$numMax)     
      return(input$num)
    }else{
      return(global$numVal)
    }
  })

  output$numInput <- renderUI(numericInput("num", "", min = global$numMin, max = global$numMax, value = numVal()))

  output$text <- renderText(input$num)
}

shinyApp(ui, server)

Недостатком является то, что вы не можете изменить значения так быстро с помощью стрелок вверх / вниз.

Изменить: Запрос на обобщение ответа для нескольких входов:

library(shiny)
amtInputs <- 6

ui <- fluidPage(
  uiOutput("numInput")
)

server <- function(input, output) {
  global <- reactiveValues(numVal = rep(25, amtInputs), numMin = rep(1, amtInputs), numMax = rep(100, amtInputs))

  numVal <- reactive({
    out <- rep(0, amtInputs)
    for(idNr in 1:amtInputs){
      id <- paste0("num", idNr)      
      if(!is.null(input[[id]])){
        out[idNr] <- input[[id]]
        if(input[[id]] < global$numMin[idNr]) out[idNr] <- global$numMin[idNr]
        if(input[[id]] > global$numMax[idNr]) out[idNr] <- global$numMax[idNr]
      }else{
        out[idNr] <- global$numVal[idNr]
      }
    }
    return(out)
  })

  output$numInput <- renderUI({
    inputs <- tagList()
    for(idNr in 1:amtInputs){
      inputs <- tagList(inputs, numericInput(paste0("num", idNr), "", min = global$numMin[idNr], max = global$numMax[idNr], value = numVal()[idNr]))
    }
    return(inputs)
  })
}

shinyApp(ui, server)
Другие вопросы по тегам