【问题标题】:Shiny numericInput() does not respect min and max values闪亮的 numericInput() 不尊重最小值和最大值
【发布时间】:2017-06-02 01:13:53
【问题描述】:

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

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

【问题讨论】:

标签: r shiny numeric-input


【解决方案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)

【讨论】:

  • 如果我有多个数字输入,这个功能将如何工作?我是否必须为每个 numericInput 复制服务器反应函数?假设我有 6 个数字输入。
  • 嗨@DanteSmith,请参阅上面的编辑以进行概括。当然,复制作品,但我认为你认为 sthg 更短,所以请参阅上面的 for 循环。您可以尝试 apply() 以获得更花哨的东西;)
  • 谢谢托尼奥!如果 numericInput 的初始值为 NA 而不是 0-100 之间的默认数字,这是否可以处理?我问的是,如果输入了一个值并且该值超过了列出的最小值和最大值,那么数字输入只会更改该值。
  • 嗨@DanteSmith,你的最后一句话当然是可能的,为什么你想通过一个我真的不明白的NA。怎么样,只要他在 0-100 的置信值范围内,就忽略输入值?无论如何,我认为最好打开一个新问题,因为它不再与错误有关。希望有帮助!
猜你喜欢
  • 2016-11-25
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2023-04-02
  • 2016-04-10
  • 2019-01-09
相关资源
最近更新 更多