3
votes

I am trying to use Shiny to select variables I want to plot in a multi-line chart rendered using Plotly. I have many variables so I want to select using Shiny instead of using Plotly's interactive legend "click" selection mechanism. Example Data:

library(plotly)                       
# Example dataframe
foo <-data.frame( mon  = c("Jan", "Feb", "Mar"),
                  var_1 = c(100, 200, 300),
                  var_b = c(80, 250, 280),
                  var_three = c(150, 120,201)
                )

When using Plotly directly I can manually add traces using code like this:

p <- plot_ly(x = foo$mon, y = foo$var_1, line = list(shape="linear"))
p <- add_trace(p, x = foo$mon, y = foo$var_b)
p <- add_trace(p, x = foo$mon, y = foo$var_three)
print(p)

Now I want to use a Shiny checkbox to select the variables I wish to see on the plot. The selection is captured in input$show_vars , but how do I loop through and plot this changing list of variables? Here is my app.R code that manually plots one of the variables. Suggestions appreciated!

#------------------------------------------------------------------------------
# UI 
#------------------------------------------------------------------------------
ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            checkboxGroupInput('show_vars', 'Columns in the dataset', names(foo),
                               selected = c('mon', 'var_1')),
            helpText('Select the variables to show in the graph.')
        ),
        mainPanel(
            plotlyOutput("myPlot")
        )
    )
)
#------------------------------------------------------------------------------
# SERVER 
# Need to loop through input$show_vars to show a trace for each one?
#------------------------------------------------------------------------------
server <- function(input, output) {
    # a large table, reative to input$show_vars
    output$uteTable = renderDataTable({
        library(ggplot2)
        ute[, input$show_vars, drop = FALSE]
    })

    output$myPlot = renderPlotly({
        plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
        ## How to add the other traces selected in input$show_vars??
    })
}
shinyApp(ui = ui, server = server)

UPDATE: I realize now that I need the script to avoid hard-coding the first plot to use foo$var_1. The plot should use any one of the possible selections in the checkboxes (minus $mon, which I have removed from the select list). When I try to make the first plot statement conditional I get the message "Error: The last plot does not exist." ie, this does not work:

output$myPlot = renderPlotly({
    # p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
    for (item in input$show_vars) {
        if (item == 1){
            p <- plot_ly(x=foo$mon, y=foo[[item]], line = list(shape="linear"))
        }
        if(item > 1){
           p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE)
        }
    }
    print(p)
1

1 Answers

5
votes

See if this is what you want. Also you probably want to remove the first two items in the checkboxGroup so that they are not removable (depending on what you want).

output$myPlot = renderPlotly({
    p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
    ## How to add the other traces selected in input$show_vars??
    for (item in input$show_vars) {
        p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE)
    }
    print(p)
})