闪亮的numericInput()不尊重最小值和最大值

时间:2017-01-17 20:19:20

标签: r shiny numeric-input

在Shiny中,如果我有一个numericInput作为输入,当用户手动输入一个值时,它不会识别或尊重最大/最小值并允许任何数字。如果用户为下拉列表选择一个箭头,它尊重值,但手动输入时不会。如何让手动输入符合上限/下限值?

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

1 个答案:

答案 0 :(得分:2)

正如@HubertL指出这是一个报告的错误。

所以你必须有可能:

  1. 接受一项小型工作,见下文或
  2. 等待它修复
  3. 如果一个丑陋的工作对你有用,直到它被修复:

    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)