闪亮的 numericInput() 不遵守最小值和最大值
Shiny numericInput() does not respect min and max values
在 Shiny 中,如果我有一个 numericInput 作为输入,当用户手动输入一个值时,它不会识别或尊重 max/min 值并允许任何 number.If 用户选择一个下拉列表的箭头它尊重这些值,但只是在手动输入时不尊重。如何让手动输入符合 upper/lower 值范围?
numericInput("test", label=("TestLabel"), min=0, max=10, value="", step = 1.0),
正如@HubertL 指出的那样,这是一个已报告的错误。
所以你有两种可能性:
- 接受一个小的解决方法,见下文或
- 等待修复
如果一个丑陋的解决方法在修复之前对您有用:
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)
缺点是您无法使用 up/down "arrows" 快速更改值。
编辑:
请求概括多个输入的答案:
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)
在 Shiny 中,如果我有一个 numericInput 作为输入,当用户手动输入一个值时,它不会识别或尊重 max/min 值并允许任何 number.If 用户选择一个下拉列表的箭头它尊重这些值,但只是在手动输入时不尊重。如何让手动输入符合 upper/lower 值范围?
numericInput("test", label=("TestLabel"), min=0, max=10, value="", step = 1.0),
正如@HubertL 指出的那样,这是一个已报告的错误。
所以你有两种可能性:
- 接受一个小的解决方法,见下文或
- 等待修复
如果一个丑陋的解决方法在修复之前对您有用:
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)
缺点是您无法使用 up/down "arrows" 快速更改值。
编辑: 请求概括多个输入的答案:
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)