Серия потребностей (проверка) в Shiny: печать только первый случай сбоя - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь создать приложение Shiny, которое имеет заданный пользователем ввод для p-значения (вероятность должна быть от 0 до 1). Ранее я велел пользователю указать значение p с помощью функции sliderInput().

Однако я считаю, что разрешение ограничено sliderInput(). Мне трудно позволить пользователю определять значения, такие как 0,001 против 0,0000000001, и при этом использовать более крупные значения, такие как 0,4. В результате я не пытаюсь позволить пользователям вводить свои значения p более гибким способом, используя Shiny textInput(). Затем они могут легко вводить значения, такие как 0,0000000001 или 1e-20 или 0,2, не пытаясь безошибочно перемещать ползунок только для того, чтобы обнаружить, что такие разрешения не существуют.

Я думаю У меня есть работающий MWE. Я использую формат validate(need), чтобы направлять пользователей, если они вводят что-то бессмысленное. Это может быть просто более мелкая деталь, но в настоящее время, если пользователь вводит значение типа «привет», он получает все три 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.'

My вопрос: Можно ли настроить этот код так, чтобы печатался только первый 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)
}

1 Ответ

1 голос
/ 14 февраля 2020

Вы можете разделить три условия:

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.'))

блестящий, затем проверяет отдельные условия одно за другим и отображает только сообщение об ошибке.

...