Steve
Steve

Reputation: 575

plot_ly plot from dplyr breaks down at input from Shiny SelectInput

I'm just learning Shiny.

Here's the code that doesn't work (along with some sample data built-in):

library(tidyverse)
library(shiny)
library(plotly)
library(shinyjs)


analysis_df<- data.frame(
  report_month = c("jan","jan","jan","jan","jan","jan"),
  payee_id = c("59","59","59","59","59","59"),
  Payee = sample(LETTERS[1:5],6,replace = TRUE),
  Attrib_1 = sample(LETTERS[6:10],6,replace = TRUE),
  Attrib_2 = sample(LETTERS[11:15],6,replace = TRUE),
  country_of_sale_iso2 = c("AU","AU","AU","NZ","AU","AU"),
  currency = c("USD","USD","USD","USD","USD","USD"),
  Attrib_3 = c("Pandora-AU","Pandora-AU","Pandora-AU","Pandora-AU","Pandora-AU","Pandora-AU"),
  month_paid = c("jun","jun","jun","jun","jun","jun"),
  Attrib_4 = sample(LETTERS[16:20],6,replace = TRUE),
  Attrib_5 = sample(LETTERS[21:25],6,replace = TRUE),
  units = c("2","8","6","2","10","4"),
  gross = c("0.003254785","0.013019141","0.009764356","0.003254785","0.016273926","0.00650957"),
  reserves_wh = c("0","0","0","0","0","0"),
  rsrv_liq = c("0","0","0","0","0","0"),
  Attrib_7 = c("0.002753548","0.011014193","0.008260645","0.002753548","0.013767741","0.005507097"),
  Attrib_8 = c("3.25E-04","0.001301914","9.76E-04","3.25E-04","0.001627393","6.51E-04"),
  Attrib_9 = c("1.76E-04","7.03E-04","5.27E-04","1.76E-04","8.79E-04","3.52E-04"),
  Attrib_10 = c("0.03","0.03","0.03","0.03","0.03","0.03"),
  Attrib_11 = c("1","1","1","1","1","1"),
  Attrib_12 = c("0.003254785","0.013019141","0.009764356","0.003254785","0.016273926","0.00650957")
)

attribs <- c("Attrib_1","Attrib_2","Attrib_3","Attrib_4")
payees <- analysis_df %>% distinct(Payee) %>% as.vector()

ui <- fluidPage(

  headerPanel("Product Explorer"),

  sidebarPanel(
  selectInput('slice_by', 'Color the Bars By:', choices = attribs, selected = "Attrib_1"),
  sliderInput('plotHeight', 'Adjust Chart Size', 
              min = 100, max = 2000, value = 425)
  ),
  mainPanel(
    plotlyOutput('Plot', height = "900px")
  )
)


server <- function(input, output) {

  output$Plot <- renderPlotly({

    col_cht <- analysis_df %>% 
      filter(payee_id == 59) %>% 
      plot_ly(x = ~report_month, 
              y = ~gross) %>%
      add_bars(color = input$slice_by) %>%
      layout(barmode = "stack",
             height = input$plotHeight)
  })

}

shinyApp(ui, server)

I want the SelectInput to work, and it doesn't.

However, if I replace

add_bars(color = input$slice_by) %>%

with

add_bars(color = ~Attrib_1) %>%

i.e., hard-code it, the plot looks the way it should.

Upvotes: 0

Views: 107

Answers (1)

Thiloshon Nagarajah
Thiloshon Nagarajah

Reputation: 131

When you are piping with

> analysis_df %>%

the analysis_df dataframe is passed to the functions. So when using ~Attrib_1 you are passing the values in the Attrib_1 column, which are

# > analysis_df$Attrib_1
# [1] H J J H H G

So the plot gets different colors for the levels in analysis_df$Attrib_1.

When you are using input$slice_by that returns only one value, the value selected in Select. So you are getting just one color in the plot.

To get it to work use

color = analysis_df[, input$slice_by]

If you don't want to use analysis_df inside pipe, search about Non-standard Evaluation in R. With lazyeval you can do this,

color = interp(~x, x = as.name(input$slice_by))

Upvotes: 1

Related Questions