r shiny numericInput允许输入大于max的值

yyyllmsg  于 2023-04-27  发布在  其他
关注(0)|答案(3)|浏览(156)

只是看看是否有解决这个问题的方法:我不希望用户在“输入数字2”中输入的值超过允许的最大值(无论在“输入数字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)
yacmzcpb

yacmzcpb1#

一个快速而肮脏的解决方案是通过一个错误消息,一个警告或简单的上限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))
7d7tgy0s

7d7tgy0s2#

我通过将numericInput()移动到服务器,并将UI中的numericInput()更改为uiOutput()来解决类似的问题。我还不熟悉observeEvents(),但我希望这个伪代码能有所帮助。

上一界面:

HTML(paste("Numeric Input Descriptor/instructions"))
    numericInput(inputId = "Num_2", label = "BLA", min = __, max = __) #1

1:这些数字是您的原始输入为您的数字输入

界面变化

HTML(paste("Numeric Input Descriptor/instructions"))
    uiOutput(outputId = "num_2")

添加到服务器函数:

output$num_2 <- renderUI({
    numericInput(inputId = "Num_2", label = "BLA", min = __, max = __) #2
    })

2:最小值是您的原始数字/值,而最大值基于ObserveEvent()

  • 当我在我的例子中设置max = ()时,我不需要说max = reactive(length(data())),而只需要length(data())
  • 此外,renderUI()的inputId与服务器中的所有其他部分一起工作,因此不需要额外的更改。

如果上面的psuedo代码还不够,我可以仔细看看。

tag5nh1u

tag5nh1u3#

检查输入是否有极值,* 如果超过 * 则有弹出警告更改输入值(例如,更改为最大值):

observe({
        if (input$value1 > 100 || input$value1 < 0) {
            showModal(
                modalDialog(
                    title = strong("Warning!", style = "font-size:24px;
                                   color: red;"),
                    p("Input value exceeds the limits.", 
                      style = "font-size:16px"),
                    footer = modalButton("Close")
                ))
            updateNumericInput(session, "value1", value = 100)
        }
    })

相关问题