Создайте предупреждающее сообщение на боковой панели R Shiny Dashboard, используя «SelectizeInput» - PullRequest
1 голос
/ 08 октября 2019

Я хотел бы добавить предупреждающее сообщение в мою блестящую боковую панель, если пользователь вводит что-то, что не распознается. Я нашел кое-что очень информативное: Проверьте блестящие вводы и сгенерируйте предупреждение о расположении боковой панели Но это не совсем то, что мне нужно, и я хотел бы услышать, что вы думаете. Ниже мой код

library(shiny)
ui <- dashboardPage(

  dashboardHeader(),
  dashboardSidebar(
    selectizeInput('email', 'Email', c("NYC@gmail.com", "LA@gmail.com","SF@gmail.com"), multiple = FALSE,
                   options = list(
                     placeholder = 'Email addresss',
                     onInitialize = I('function() { this.setValue(""); }')
                   )),
    uiOutput('email_text')
  ),
  dashboardBody()
)

server <- function(input, output) {
  output$email_text <-
    renderUI({
      if(input$email == ""){
        return(p("Please add your gmail e-mail address."))
      }

      #Update: Below checks for "gmail" - I would something to search list and return.
      if(!grepl("gmail", input$email)){
        return(p("Your email is not a gmail e-mail address!"))
      }

    })
}

shinyApp(ui = ui, server = server)

Текущий выбор боковой панели хорошо работает для распознавания формата электронной почты, пока я выбираю из выпадающего списка The part that works well

Однако, чтоЯ также хочу добавить, что если я ввожу что-то, что не ожидается (не в списке, указанном), система может зафиксировать это и предупредить меня (например, «Ваш адрес электронной почты не является ожидаемым адресом электронной почты!»). В настоящее время, если я просто ввожу что-то, чего нет в списке, система ничего не делает: The part that does not work...

Я чувствую, что по сравнению с сообщением, которое я упомянул выше, моя версия имеет проблемы сфункция selectizeInput. Он предназначен для получения элементов из списка, а не всего, что пользователь вводит. Есть ли способ обойти это? Я пытаюсь использовать validate (), но безуспешно.

Большое спасибо заранее за вашу помощь!

1 Ответ

2 голосов
/ 08 октября 2019

По умолчанию selecticizeInput не позволяет пользователю вводить новые значения. Вы должны включить это с помощью options = list(create = TRUE). Если у вас есть эта опция, вы можете проверить, находится ли вновь созданное электронное письмо в предварительно определенном списке электронных писем, используя %in% и сообщить о пользовательском сообщении об ошибке на боковой панели.

Вот обновленный код:

library(shiny)
library(shinydashboard)

list_of_emails <- c("NYC@gmail.com", "LA@gmail.com", "SF@gmail.com")

ui <- dashboardPage(dashboardHeader(),
                    dashboardSidebar(
                      selectizeInput(
                        'email',
                        'Email',
                        c("NYC@gmail.com", "LA@gmail.com", "SF@gmail.com"),
                        multiple = FALSE,
                        options = list(
                          create=TRUE,
                          placeholder = 'Email addresss',
                          onInitialize = I('function() { this.setValue(""); }')
                        )
                      ),
                      uiOutput('email_text')
                    ),
                    dashboardBody())

server <- function(input, output) {
  output$email_text <-
    renderUI({
      # print the input email to the console to help with debugging
      message(input$email)
      if (input$email == "") {
        return(p("Please add your gmail e-mail address."))
      }

      #Update: Below checks for "gmail" - I would something to search list and return.
      if (!input$email %in% list_of_emails) {
        return(p("Your email is not in the list of emails!"))
      }

    })
}

runApp(list(ui = ui, server = server))

...