Search code examples
rggplot2shinyinteractive

Interactive plotting on RShiny


I am currently trying to make an interactive app on shiny where with my data frame "keep_df" you can choose which kind of plot you want to use and for the x and y axes you can choose any of the columns from keep_df. Below is my code. I'm not getting any error messages, but the code is not running as desired. I was wondering if anyone had any suggestions. Thanks!

ui <- navbarPage ("Title",
   
                  
   tabPanel("Chart builder", 
          sidebarLayout(
          sidebarPanel(
            
       pickerInput(inputId = 'chart', label = '1. Select chart type', choices = c("Scatter plot", "Bar chart", "Histogram", "Pie chart", "Box plot"), selected = NULL, multiple = FALSE),
      
       pickerInput(inputId = 'xaxis', label = '2. Select X-axis', choices = colnames(keep_df), selected = NULL, multiple = FALSE),
  
       pickerInput(inputId = 'yaxis', label = '3. Select Y-axis', choices = colnames(keep_df), selected = NULL, multiple = FALSE),
       
      uiOutput("picker2"),
      actionButton("view", "View selection"),
          ),
             mainPanel(ui <- DT::dataTableOutput("charttable"), plotOutput("plots")),
          )
       )
            
)


server <- function(input, output, session) {
  
   data <- reactive(
    keep_df
   )
  
  plots <- reactive({
    if (input$chart == 'Scatter plot') {
      ggplot(data(), aes(x = input$xaxis, y = input$yaxis)) +
        geom_point(colour = "black")
    }
    if (input$chart == 'Bar chart') {
      ggplot(data(), aes(x = input$xaxis, y = input$yaxis)) +
        geom_point(colour = "black")
    }
    })
  
  output$plots <- renderPlot(
     plots()
  ) 
}

Solution

  • You were pretty close with your code, I noticed a few issues. First, you have an extra ui <- which I could see causing an error. Second, in the plots reactive, where you had x = input$xaxis, it would send a string to the ggplot, rather than a variable. Meaning it wouldn't read the column. I also made the plots reactive as an if and else if, rather than two if statements. Hope this helps!

    Note that I didn't have the dataframe, so I just used mtcars for simplicity. There were a few lines I blocked out too. I also added the library and the shinyApp call too, since it wasn't in your example.

    library(shiny)
    library(ggplot2)
    library(shinyWidgets)
    
    keep_df<-mtcars #Don't have the data, just using mtcars
    
    ui <- navbarPage ("Title",
                      tabPanel("Chart builder", 
                               sidebarLayout(
                                 sidebarPanel(
                                   pickerInput(inputId = 'chart', label = '1. Select chart type', choices = c("Scatter plot", "Bar chart", "Histogram", "Pie chart", "Box plot"), selected = NULL, multiple = FALSE),
                                   pickerInput(inputId = 'xaxis', label = '2. Select X-axis', choices = colnames(keep_df), selected = NULL, multiple = FALSE),
                                   pickerInput(inputId = 'yaxis', label = '3. Select Y-axis', choices = colnames(keep_df), selected = NULL, multiple = FALSE)#, 
                                   # uiOutput("picker2"), #Not doing anything
                                   # actionButton("view", "View selection") #Not doing anything
                                 ),
                                 mainPanel(DT::dataTableOutput("charttable"), plotOutput("plots")), #Removed the ui <-
                               )
                      )
    )
    
    
    server <- function(input, output, session) {
      data <- reactive(
        keep_df
      )
      plots <- reactive({
        if (input$chart == 'Scatter plot') {
          #without the eval(parse(text =)), it reads as string, not variable
          ggplot(data(), aes(x = eval(parse(text = input$xaxis)), y = eval(parse(text = input$yaxis)))) + 
            geom_point(colour = "black")
        } else if (input$chart == 'Bar chart') {
          ggplot(data(), aes(x = eval(parse(text = input$xaxis)), y = eval(parse(text = input$yaxis)))) + 
            geom_boxplot(colour = "black")
        }
      })
      
      output$plots <- renderPlot(
        plots()
      ) 
    

    }

    shinyApp(ui, server)