Shiny 中的一系列需求(验证):仅打印第一个失败案例

Series of need(validate) in Shiny: Printing only the first case of failure

我正在尝试创建一个闪亮的应用程序,它具有用户指定的 p 值输入(应该是 0 到 1 之间的概率)。之前,我让用户使用 sliderInput() 函数指定 p 值。

但是,我发现 sliderInput() 的分辨率受到限制。我很难让用户定义像 0.001 和 0.0000000001 这样的值,并且仍然使用像 0.4 这样的更大的值。因此,我不会尝试让用户使用 Shiny textInput() 以更灵活的方式输入他们的 p 值。然后,他们可以轻松地输入诸如 0.0000000001 或 1e-20 或 0.2 之类的值,而不会沮丧地尝试完美地移动滑块却发现这样的分辨率不存在。

认为 我有一个工作的 MWE。我正在使用 validate(need) 格式来指导用户输入无意义的内容。它可能只是一个更详细的细节,但目前,如果用户输入类似 "hello" 的值,他们会从应用程序收到所有三个 validate(need) 消息:

'P-value must be a decimal between 0 and 1.'
'P-value must be less than or equal to 1.'
'P-value must be greater than or equal to 0.'

我的问题是: 是否可以调整此代码以便只打印失败的第一个 validate(need)?尽管使用数字,但如果还有其他与使用 textInput() 而不是 sliderInput() 相关的可预见问题,请随时分享。谢谢你的建议!

我的 MWE:

if (interactive()) {
    options(device.ask.default = FALSE)

    ui <- fluidPage(
        textInput("PValue", "P-value:", value = "0.05"),
        plotOutput('plot')
    )

    server <- function(input, output) {
        output$plot <- renderPlot({
            cat(str(input$PValue))

            validate(
                need(!is.na(as.numeric(input$PValue)), 'P-value must be a decimal between 0 and 1.'),
                need(as.numeric(input$PValue) <= 1, 'P-value must be less than or equal to 1.'),
                need(as.numeric(input$PValue) >= 0, 'P-value must be greater than or equal to 0.')
            )

            plot(input$PValue)
        })
        p
    }
    shinyApp(ui, server)
}

您可以将三个条件分开:

validate(need(is.numeric(input$PValue), 'P-value must be a decimal between 0 and 1.'))
validate(need(as.numeric(input$PValue) <= 1, 'P-value must be less than or equal to 1.')),
validate(need(as.numeric(input$PValue) >= 0, 'P-value must be greater than or equal to 0.'))

shiny 然后一个接一个地检查各个条件并只显示一条错误消息。