Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

suppress plotly warnings in shiny app

Tags:

r

shiny

plotly

I have a shiny app like the following:

server.R:

shinyServer(function(input, output) {

  output$trendPlot <- renderPlotly({
    plot_ly(movies, x = length, y=rating, mode='markers', color=as.factor(year), colors = c("#132B43", "#56B1F7")) -> plott

    plott
  })
})

ui.R:

library(shiny)
library(plotly)
library(ggplot2movies)  # Needed for the 'movies' data set

shinyUI(fluidPage(
  titlePanel("Movie Ratings!"),
  mainPanel(
    plotlyOutput("trendPlot")
  )
))

This produces a warning:

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

I would like to suppress this warning because it's unnecessarily cluttering up my logs (yes, I know how to actually get rid of this warning by fixing the issue. But this is for illustrative purposes only. In my actual shiny app there is no getting rid of the warning).

Wrapping the final plott in renderPlotly() in suppressWarnings() does not work. Changing plott to suppressWarnings(print(plott)) does work but also prints the plot outside of the UI context. Can this be done cleanly?

like image 400
RoyalTS Avatar asked Mar 12 '23 09:03

RoyalTS


1 Answers

In the example below I suppress warnings (globally), and later restore them, but after the plot is completed, using shinyjs::delay. A bit hacky, but warnings are suppressed. As an alternative, you can just do options(warn = -1) and restore the warning manually.

library(shiny)
library(plotly)
library(shinyjs)
library(ggplot2movies)  # Needed for the 'movies' data set

ui <- shinyUI(fluidPage(
  useShinyjs(),
  titlePanel("Movie Ratings!"),
  mainPanel(
    plotlyOutput("trendPlot")
  )
))

server <- shinyServer(function(input, output) {

  # suppress warnings  
  storeWarn<- getOption("warn")
  options(warn = -1) 

  output$trendPlot <- renderPlotly({

    plot_ly(movies, x = length, y=rating, mode='markers', color=as.factor(year), colors = c("#132B43", "#56B1F7")) -> plott

    #restore warnings, delayed so plot is completed
    shinyjs::delay(expr =({ 
      options(warn = storeWarn) 
    }) ,ms = 100) 

    plott
  })
})

shinyApp(ui, server) 
like image 138
Eduardo Bergel Avatar answered Mar 27 '23 11:03

Eduardo Bergel