r блестящий numericInput позволяет вводить значения выше максимального

Просто проверяю, есть ли еще решение этой проблемы: я не хочу, чтобы пользователь вводил значения в "Вход № 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)

3 ответа

Решение

Одно быстрое и грязное решение было бы через сообщение об ошибке, предупреждение или просто заглушку 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() на сервер, и изменение 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()), Возможно, вам просто нужно ObserveEvents()

  • Кроме того, inputId из renderUI() работал со всеми другими моими частями на сервере, поэтому никаких дополнительных изменений не требовалось.

Я могу рассмотреть это более подробно, если приведенного выше кода psuedo недостаточно.

Проверьте ввод на наличие экстремальных значений, если они превышают , появится всплывающее предупреждение и измените входное значение (например, на максимальное значение):

      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)
        }
    })
Другие вопросы по тегам