Tooltips for a dropdown list in Shiny

[This article was first published on Saturn Elephant, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Here is how to have some tooltips for the options and their headers of a selectizeInput in Shiny.

library(shiny)

ui <- fluidPage(
  selectizeInput(
    inputId = "selectAnimals",
    label = "Select some animals",
    choices = NULL,
    multiple = TRUE,
    options = list(
      options = list(
        list(
          species = "mammal", value = "dog", name = "Dog", 
          tooltip = "it's a pet"
        ),
        list(
          species = "mammal", value = "cat", name = "Cat", 
          tooltip = "another pet"
        ),
        list(
          species = "mammal", value = "kangaroo", name = "Kangaroo",
          tooltip = "it jumps"
        ),
        list(
          species = "bird", value = "duck", name = "Duck",
          tooltip = "like Donald"
        ),
        list(
          species = "bird", value = "ostrich", name = "Ostrich",
          tooltip = "very tasty"
        ),
        list(
          species = "bird", value = "seagull", name = "Seagull",
          tooltip = "it's a seabird"
        ),
        list(
          species = "reptile", value = "snake", name = "Snake",
          tooltip = "it has no leg"
        ),
        list(
          species = "reptile", value = "lizard", name = "Lizard",
          tooltip = "mainly carnivorous"
        ),
        list(
          species = "reptile", value = "turtle", name = "Turtle",
          tooltip = "it is slow"
        )
      ),
      optgroups = list(
        list(
          value = "mammal",  label = "Mammal",  tooltip = "like us"
        ),
        list(
          value = "bird",    label = "Bird",    tooltip = "they fly"
        ),
        list(
          value = "reptile", label = "Reptile", tooltip = "not only snakes"
        )
      ),
      optgroupField = "species",
      labelField = "name",
      render = I(
        "{
          optgroup_header: function(data, escape) {
            return '<div class=\"optgroup-header\"><span ' + 
              'title=\"' + data.tooltip + '\">' + escape(data.label) + 
              '</span></div>';
          },
          option: function(data, escape) {
            return '<div class=\"option\"><span ' + 
              title=\"' + data.tooltip + '\">' + escape(data.name) + 
              '</span></div>';
          }
        }"
      )
    )
  )
)

server <- function(input, output, session) {}

shinyApp(ui, server)

It’s also possible to have Bootstrap tooltips. They are prettier, and customizable. To do so, replace the render option with the following one (that could differ if you use Bootstrap 5) and add this onDropdownOpen option and this onChange options to initialize them or reinitialize them:

render = I(
  "{
    optgroup_header: function(data, escape) {
      return '<div class=\"optgroup-header\"><span ' + 
        'data-toggle=\"tooltip\" data-placement=\"right\" title=\"' + 
        data.tooltip + '\">' + escape(data.label) + '</span></div>';
    },
    option: function(data, escape) {
      return '<div class=\"option\"><span ' + 
        'data-toggle=\"tooltip\" data-placement=\"top\" title=\"' + 
        data.tooltip + '\">' + escape(data.name) + '</span></div>';
    }
  }"
),
onDropdownOpen = I(
  "function() {
     setTimeout(function(){$('[data-toggle=tooltip]').tooltip();}, 100);
  }"
),
onChange = I(
  "function() {
     setTimeout(function(){$('[data-toggle=tooltip]').tooltip();}, 100);
  }"
)

To leave a comment for the author, please follow the link and comment on their blog: Saturn Elephant.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)