The shinyFeedback package displays user friendly messages that appear alongside shiny inputs.  e.g.

shinyFeedback currently works with the following shiny and shinyWidgets inputs:
shiny::dateInput()shiny::dateRangeInput()shiny::fileInput()shiny::numericInput()shiny::passwordInput()shiny::selectInput()shiny::sliderInput()shiny::textAreaInput()shiny::textInput()shinyWidgets::airDatepickerInput()shinyWidgets::pickerInput()In order to use shinyFeedback you need to include the useShinyFeedback() function at the top of your UI.
The following is a minimal example of a shiny app that uses shinyFeedback.  Run the following code in your R console to run the app.
library(shiny) library(shinyFeedback) ui <- fluidPage( useShinyFeedback(), # include shinyFeedback textInput( "myInput", "Warn if >3 characters", value = "" ) ) server <- function(input, output, session) { observeEvent(input$myInput, { if (nchar(input$myInput) > 3) { showFeedbackWarning( inputId = "myInput", text = "too many chars" ) } else { hideFeedback("myInput") } }) } shinyApp(ui, server)
The above app has one textInput() input in the UI.  In the server function, we write the code to conditionally display a feedback message. If the text input has more than 3 characters, the feedback message is displayed.
feedback()The feedback() function is an alternative to using showFeedback() and hideFeedback().  With feedback() the feedback message is shown/hidden based on whether the show argument to feedback() is "truthy".  "truthiness" is determined by shiny::isTruthy().  feedback() works nicely with reactive expressions that use shiny::req() to check the validity of Shiny inputs.  e.g.
library(shiny) library(shinyFeedback) ui <- fluidPage( useShinyFeedback(), # include shinyFeedback selectInput( "dataset", "Dataset", choices = c( "airquality", "Unknown dataset" ) ), tableOutput('data_table') ) server <- function(input, output, session) { data_out <- reactive({ req(input$dataset) dataset_exists <- exists(input$dataset, "package:datasets") feedbackWarning("dataset", !dataset_exists, "Unknown dataset") req(dataset_exists, cancelOutput = TRUE) get(input$dataset, "package:datasets") }) output$data_table <- renderTable({ head(data_out()) }) } shinyApp(ui, server)
shinyFeedback works inside shiny modules.
As for all modules, input and output IDs in the module UI code must be wrapped in shiny::ns() calls.
Inside your module server code, you need not wrap input or output IDs inside shiny::ns(); shinyFeedback will automatically prepend the namespace of your current module.
Here is a simple example using shinyFeedback inside a module:
library(shiny) library(shinyFeedback) numberInput <- function(id) { ns <- NS(id) tagList( useShinyFeedback(), numericInput( ns("warningInput"), "Warn if Negative", value = 0 ) ) } number <- function(input, output, session) { observeEvent(input$warningInput, { req(input$warningInput) if (input$warningInput < 0) { showFeedbackWarning(inputId = "warningInput") } else { hideFeedback("warningInput") } }) } ui <- fluidPage( numberInput(id = "numberFoo") ) server <- function(input, output) { callModule(module = number, id = "numberFoo") } shinyApp(ui, server)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.