【问题标题】:r shiny numericInput allows the entry of values above the maxr shiny numericInput 允许输入高于最大值的值
【发布时间】:2018-03-22 03:43:59
【问题描述】:

只是检查是否有解决此问题的方法: 我不希望用户在“输入编号 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)

【问题讨论】:

  • 最小值和最大值仅在您使用箭头更改输入时有效,但如果您键入它,它将不会像您的示例中那样起作用。您必须在服务器中使用 if 语句。

标签: r shiny numeric-input


【解决方案1】:

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

【讨论】:

  • 谢谢,但从用户的角度来看,它并没有真正起作用。首先,用户仍然可以在 FIRST 框中手动输入一个高于允许最大值的值 - 并且没有任何反应。第二 - 对于第二个框 - 输入高于允许最大值的值的用户看不到警告消息,因为他们进入控制台,而不是美国。
  • 您可以对第一个框使用相同的技巧(即将值限制为max_number1)。此外,您可以在服务器上而不是在 R 控制台中以闪亮的方式打印消息。请参阅这两个主题:stackoverflow.com/questions/24873961/printing-text-in-shinystackoverflow.com/questions/27139348/…
【解决方案2】:

我通过将 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())。也许你只需要ObserveEvents()

  • 此外,renderUI() 中的 inputId 与我所有的 服务器中的其他部分,因此不需要额外的更改。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2012-08-15
  • 2012-07-06
  • 2013-02-22
相关资源
最近更新 更多