Helene
Helene

Reputation: 959

Generate warning message on R Shiny Dashboard Sidebar using "SelectizeInput"

I would like to add a warning message, in my shiny dashboard sidebar, if user enters something that is not recognized. I found something very informative: Check Shiny inputs and generate warning on sidebar layout But it is not exactly what I need, and would like to hear what you think. Below is my code

library(shiny)
ui <- dashboardPage(

  dashboardHeader(),
  dashboardSidebar(
    selectizeInput('email', 'Email', c("[email protected]", "[email protected]","[email protected]"), 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)

Current sidebar selection performs well to recognize email format, as long as I select from the dropdown list The part that works well

However, what I also want to add in is, if I enter something that is not expected (not in the list given), the system can capture that and warn me (E.g. "Your email is not an expected email address!"). Currently, if I just enter some something not in the list, the system does not do anything: The part that does not work...

I feel that comparing with post I mentioned above, my version has issue with "selectizeInput" function. It is designed to intake elements from the list, not everything user enters. Is there a way to work around it? I try to use validate() but had no luck.

Thanks so much in advance for your help!

Upvotes: 2

Views: 412

Answers (1)

teofil
teofil

Reputation: 2384

By default selecticizeInput does not allow the user to enter new values. You have to enable this with options = list(create = TRUE). Once you have this option, you can check whether the newly created email is in the pre-defined list of emails using %in% and report a custom error message in the sidebar.

Here is the updated code:

library(shiny)
library(shinydashboard)

list_of_emails <- c("[email protected]", "[email protected]", "[email protected]")

ui <- dashboardPage(dashboardHeader(),
                    dashboardSidebar(
                      selectizeInput(
                        'email',
                        'Email',
                        c("[email protected]", "[email protected]", "[email protected]"),
                        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))

Upvotes: 3

Related Questions