Home > Blockchain >  Interactive plotting on RShiny
Interactive plotting on RShiny

Time:07-09

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()
  ) 
}

CodePudding user response:

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)

  • Related