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.