Home > database >  Selecting data by brush on uploaded dataset
Selecting data by brush on uploaded dataset

Time:06-08

Dataset example

    mpg cyl  disp  hp drat    wt  qsec vs am
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1
4  21.4   6 258.0 110 3.08 3.215 19.44  1  0
5  18.7   8 360.0 175 3.15 3.440 17.02  0  0
6  18.1   6 225.0 105 2.76 3.460 20.22  1  0
7  14.3   8 360.0 245 3.21 3.570 15.84  0  0
8  24.4   4 146.7  62 3.69 3.190 20.00  1  0
9  22.8   4 140.8  95 3.92 3.150 22.90  1  0
10 19.2   6 167.6 123 3.92 3.440 18.30  1  0
11 17.8   6 167.6 123 3.92 3.440 18.90  1  0
12 16.4   8 275.8 180 3.07 4.070 17.40  0  0
13 17.3   8 275.8 180 3.07 3.730 17.60  0  0
14 15.2   8 275.8 180 3.07 3.780 18.00  0  0
15 10.4   8 472.0 205 2.93 5.250 17.98  0  0
16 10.4   8 460.0 215 3.00 5.424 17.82  0  0
17 14.7   8 440.0 230 3.23 5.345 17.42  0  0
18 32.4   4  78.7  66 4.08 2.200 19.47  1  1
19 30.4   4  75.7  52 4.93 1.615 18.52  1  1
20 33.9   4  71.1  65 4.22 1.835 19.90  1  1
21 21.5   4 120.1  97 3.70 2.465 20.01  1  0
22 15.5   8 318.0 150 2.76 3.520 16.87  0  0
23 15.2   8 304.0 150 3.15 3.435 17.30  0  0
24 13.3   8 350.0 245 3.73 3.840 15.41  0  0
25 19.2   8 400.0 175 3.08 3.845 17.05  0  0
26 27.3   4  79.0  66 4.08 1.935 18.90  1  1
27 26.0   4 120.3  91 4.43 2.140 16.70  0  1
28 30.4   4  95.1 113 3.77 1.513 16.90  1  1
29 15.8   8 351.0 264 4.22 3.170 14.50  0  1
30 19.7   6 145.0 175 3.62 2.770 15.50  0  1
31 15.0   8 301.0 335 3.54 3.570 14.60  0  1
32 21.4   4 121.0 109 4.11 2.780 18.60  1  1
   gear carb
1     4    4
2     4    4
3     4    1
4     3    1
5     3    2
6     3    1
7     3    4
8     4    2
9     4    2
10    4    4
11    4    4
12    3    3
13    3    3
14    3    3
15    3    4
16    3    4
17    3    4
18    4    1
19    4    2
20    4    1
21    3    1
22    3    2
23    3    2
24    3    4
25    3    2
26    4    1
27    5    2
28    5    2
29    5    4
30    5    6
31    5    8
32    4    2

I am trying to select data by brush on the uploaded dataset. I have tried many ways to make it work with the uploaded dataset but it gives the following error

Warning: Error in brushedPoints: brushedPoints: `xvar` ('.data[["the chosen variable"]]')  not in names of input 

What should we exactly write in the 'brushedPoints' part to make it work? It does work when the dataset is already loaded in the shiny, however, the uploaded version is giving errors.

library(shiny)
library(ggplot2)
library(datasets)

ui <- shinyUI(fluidPage(
  titlePanel("Plot"),
  tabsetPanel(
    tabPanel("Upload File",
             titlePanel("Uploading Files"),
             sidebarLayout(
               sidebarPanel(
                 fileInput('file1', 'Choose CSV File',
                           accept=c('text/csv', 
                                    'text/comma-separated-values,text/plain', 
                                    '.csv')),
                 tags$br(),
                 checkboxInput('header', 'Header', TRUE),
                 radioButtons('sep', 'Separator',
                              c(Comma=',',
                                Semicolon=';',
                                Tab='\t'),
                              ','),
                 radioButtons('quote', 'Quote',
                              c(None='',
                                'Double Quote'='"',
                                'Single Quote'="'"),
                              '"')
                 
               ),
               mainPanel(
                 tableOutput('contents')
               )
             )
    ),
    tabPanel("First Type",
             pageWithSidebar(
               headerPanel('My First Plot'),
               sidebarPanel(
                 
                 selectInput('xcol', 'X Variable', ""),
                 selectInput('ycol', 'Y Variable', "", selected = "")

                                ),
               mainPanel(
                 plotOutput('MyPlot', click = "plot_click",
                            hover = hoverOpts(id = "plot_hover", delayType = "throttle"),
                            brush = brushOpts(id = "plot_brush")),
                 hr(),
                 tableOutput("plot_brushedpoints")
               )
             )
    )
    
  )
)
)

server <- shinyServer(function(input, output, session) {
  
  
  data <- reactive({ 
    req(input$file1) 
    
    inFile <- input$file1 

    df <- read.csv(inFile$datapath, header = input$header, sep = input$sep,
                   quote = input$quote)

    
    updateSelectInput(session, inputId = 'xcol', label = 'X Variable',
                      choices = names(df), selected = names(df))
    updateSelectInput(session, inputId = 'ycol', label = 'Y Variable',
                      choices = names(df), selected = names(df)[2])
    
    return(df)
  })
  
  output$contents <- renderTable({
    data()
  })
  
  output$MyPlot <- renderPlot({
    graph <- ggplot(data(), aes(.data[[input$xcol]], .data[[input$ycol]]))  
      geom_point(position='jitter') 

    graph
  })
  
  output$plot_brushedpoints <- renderTable({
    df<- data()  
    res <- brushedPoints(df, input$plot_brush,
                         xvar = df$xcol,
                         yvar = df$ycol,
                         panelvar1 = NULL,
                         panelvar2 = NULL,
                         allRows = FALSE
    )
    if (nrow(res) == 0|is.null(res))
      return(NULL)
    res
  })
  
  
})

shinyApp(ui, server)

CodePudding user response:

The reason why you get that error is from this piece of code:

xvar = df$xcol
yvar = df$ycol

You cannot subset a dataframe (in your case data()) because it doesn't have those columns (xcol and ycol). If you want to subset a dataframe that is stored in a reactive function with an input from the user, you need to do it using this way: df[input$xcol].

However, for this purpose, you don't need to call the df. You just have to replace the vars:

 xvar = input$xcol
 yvar = input$ycol

Here the complete code:

   library(shiny)
library(ggplot2)
library(datasets)

ui <- shinyUI(fluidPage(
  titlePanel("Plot"),
  tabsetPanel(
    tabPanel("Upload File",
             titlePanel("Uploading Files"),
             sidebarLayout(
               sidebarPanel(
                 fileInput('file1', 'Choose CSV File',
                           accept=c('text/csv', 
                                    'text/comma-separated-values,text/plain', 
                                    '.csv')),
                 tags$br(),
                 checkboxInput('header', 'Header', TRUE),
                 radioButtons('sep', 'Separator',
                              c(Comma=',',
                                Semicolon=';',
                                Tab='\t'),
                              ','),
                 radioButtons('quote', 'Quote',
                              c(None='',
                                'Double Quote'='"',
                                'Single Quote'="'"),
                              '"')
                 
               ),
               mainPanel(
                 tableOutput('contents')
               )
             )
    ),
    tabPanel("First Type",
             pageWithSidebar(
               headerPanel('My First Plot'),
               sidebarPanel(
                 
                 selectInput('xcol', 'X Variable', ""),
                 selectInput('ycol', 'Y Variable', "", selected = "")
                 
               ),
               mainPanel(
                 plotOutput('MyPlot', click = "plot_click",
                            hover = hoverOpts(id = "plot_hover", delayType = "throttle"),
                            brush = brushOpts(id = "plot_brush")),
                 hr(),
                 tableOutput("plot_brushedpoints")
               )
             )
    )
    
  )
)
)

server <- shinyServer(function(input, output, session) {
  
  
  data <- reactive({ 
    req(input$file1) 
    
    inFile <- input$file1 
    
    df <- read.csv(inFile$datapath, header = input$header, sep = input$sep,
                   quote = input$quote)
    
    
    updateSelectInput(session, inputId = 'xcol', label = 'X Variable',
                      choices = names(df), selected = names(df))
    updateSelectInput(session, inputId = 'ycol', label = 'Y Variable',
                      choices = names(df), selected = names(df)[2])
    
   

    return(df)
  })
  
  output$contents <- renderTable({
    data()
  })
  
  output$MyPlot <- renderPlot({
    graph <- ggplot(data(), aes(.data[[input$xcol]], .data[[input$ycol]]))  
      geom_point(position='jitter') 
    
    graph
  })
  
  output$plot_brushedpoints <- renderTable({
    df<- data()  
    res <- brushedPoints(df, input$plot_brush,
                         xvar = input$xcol,
                         yvar = input$ycol,
                         panelvar1 = NULL,
                         panelvar2 = NULL,
                         allRows = FALSE
    )
    if (nrow(res) == 0|is.null(res))
      return(NULL)
    res
  })
  
  
})

shinyApp(ui, server)

By the way, just a tip,updateSelectInput can be outside your data(), it works as you have it, but personally, I don't mix the data with update functions. I don't know if my way is better or not, but I usually write it outside. Just in case you didn't know it. However, I always use observe, since updateSelectInput needs to be in a reactive context.

observe({
    updateSelectInput(session, inputId = 'xcol', label = 'X Variable',
                      choices = names(data()), selected = names(data()))
    updateSelectInput(session, inputId = 'ycol', label = 'Y Variable',
                      choices = names(data()), selected = names(data())[2])
  })

Hope that this answer your question!

  • Related