r shiny numericInput 允许输入高于最大值的值
r shiny numericInput allows the entry of values above the max
只是检查是否还有解决此问题的方法:
我不希望用户在 "Input number 2" 中输入高于允许最大值的值(无论在 "Input number 1" 中输入什么)。
它在用户使用微调器时有效,但在用户仅键入值时无效。
library(shiny)
ui <- fluidPage(
numericInput(inputId = "inNumber1", label = "Input number 1",
value = 100, min = 10, max = 200, step = 10),
numericInput(inputId = "inNumber2", label = "Input number 2",
value = 50, min = 10, max = 200, step = 10),
textOutput("out1"),
textOutput("out2")
)
server <- function(input, output, session) {
# Reacting to changes in input 1:
observeEvent(input$inNumber1, {
number1 <- input$inNumber1 # value 1
updateNumericInput(session, inputId = "inNumber2",
label = "Input number 2",
value = floor(number1/2),
min = 10, max = number1, step = 10)
output$out1 <- renderText({number1})
})
# Reacting to changes in input 2:
observeEvent(input$inNumber2, {
number2 <- input$inNumber2 # value 2
output$out2 <- renderText({number2})
})
}
shinyApp(ui, server)
一个快速而肮脏的解决方案是通过错误消息、警告或简单地限制 number2
。
# Reacting to changes in input 2:
observeEvent(input$inNumber2, {
number2 <- input$inNumber2 # value 2
max_number2 <- 200
if(number2 > max_number2) {
## Conditions
number2 <- max_number2
}
output$out2 <- renderText({number2})
})
或者,对于停止条件:
## Condition
stop(paste0("number2 must be lower than ", max_number2))
或者,对于警告条件
## Condition
number2 <- max_number2
warning(paste0("number2 is set to ", max_number2))
我通过将 numericInput()
移动到服务器并将 UI 中的 numericInput()
更改为 uiOutput()
解决了类似的问题。我还不熟悉 observeEvents()
,但我希望这个 pseudo-code 能有所帮助。
上一个UI:
HTML(paste("Numeric Input Descriptor/instructions"))
numericInput(inputId = "Num_2", label = "BLA", min = __, max = __) #1
1:这些数字是您输入数字的原始输入
UI
的变化
HTML(paste("Numeric Input Descriptor/instructions"))
uiOutput(outputId = "num_2")
添加到服务器功能:
output$num_2 <- renderUI({
numericInput(inputId = "Num_2", label = "BLA", min = __, max = __) #2
})
2:最小值是您原来的number/value,而最大值是基于ObserveEvent()
。
当我在我的例子中设置max = ()
时,我不需要说max =
reactive(length(data()))
,而只是length(data())
。也许你只需要 ObserveEvents()
此外,renderUI()
中的 inputId 与我所有的
服务器中的其他部分,因此不需要进行其他更改。
如果上面的伪代码还不够,我可以仔细看看。
只是检查是否还有解决此问题的方法: 我不希望用户在 "Input number 2" 中输入高于允许最大值的值(无论在 "Input number 1" 中输入什么)。 它在用户使用微调器时有效,但在用户仅键入值时无效。
library(shiny)
ui <- fluidPage(
numericInput(inputId = "inNumber1", label = "Input number 1",
value = 100, min = 10, max = 200, step = 10),
numericInput(inputId = "inNumber2", label = "Input number 2",
value = 50, min = 10, max = 200, step = 10),
textOutput("out1"),
textOutput("out2")
)
server <- function(input, output, session) {
# Reacting to changes in input 1:
observeEvent(input$inNumber1, {
number1 <- input$inNumber1 # value 1
updateNumericInput(session, inputId = "inNumber2",
label = "Input number 2",
value = floor(number1/2),
min = 10, max = number1, step = 10)
output$out1 <- renderText({number1})
})
# Reacting to changes in input 2:
observeEvent(input$inNumber2, {
number2 <- input$inNumber2 # value 2
output$out2 <- renderText({number2})
})
}
shinyApp(ui, server)
一个快速而肮脏的解决方案是通过错误消息、警告或简单地限制 number2
。
# Reacting to changes in input 2:
observeEvent(input$inNumber2, {
number2 <- input$inNumber2 # value 2
max_number2 <- 200
if(number2 > max_number2) {
## Conditions
number2 <- max_number2
}
output$out2 <- renderText({number2})
})
或者,对于停止条件:
## Condition
stop(paste0("number2 must be lower than ", max_number2))
或者,对于警告条件
## Condition
number2 <- max_number2
warning(paste0("number2 is set to ", max_number2))
我通过将 numericInput()
移动到服务器并将 UI 中的 numericInput()
更改为 uiOutput()
解决了类似的问题。我还不熟悉 observeEvents()
,但我希望这个 pseudo-code 能有所帮助。
上一个UI:
HTML(paste("Numeric Input Descriptor/instructions"))
numericInput(inputId = "Num_2", label = "BLA", min = __, max = __) #1
1:这些数字是您输入数字的原始输入
UI
的变化 HTML(paste("Numeric Input Descriptor/instructions"))
uiOutput(outputId = "num_2")
添加到服务器功能:
output$num_2 <- renderUI({
numericInput(inputId = "Num_2", label = "BLA", min = __, max = __) #2
})
2:最小值是您原来的number/value,而最大值是基于ObserveEvent()
。
当我在我的例子中设置
max = ()
时,我不需要说max = reactive(length(data()))
,而只是length(data())
。也许你只需要ObserveEvents()
此外,
renderUI()
中的 inputId 与我所有的 服务器中的其他部分,因此不需要进行其他更改。
如果上面的伪代码还不够,我可以仔细看看。