Shiny: Column Selection with data.table

Hi Friends,

How should the input variables in Shiny be accessed for operations using data.table package . Below is the code from one of demo example trying to replace Base R column selection with data.table but get an error. Error lies in selectedData reactive.

IF i replace the input$xcol and input$ycol by any of column names directly it works. but unable to get it working with input$...

library(shiny)
library(data.table)


vars <- setdiff(names(iris), "Species")
ui<-fluidPage(
pageWithSidebar(
  headerPanel('Iris k-means clustering'),
  sidebarPanel(
    selectInput('xcol', 'X Variable', vars),
    selectInput('ycol', 'Y Variable', vars, selected = vars[[2]]),
    numericInput('clusters', 'Cluster count', 3, min = 1, max = 9)
  ),
  mainPanel(
    plotOutput('plot1')
  )
)
)

server<- function(input, output, session) {
  
  selectedData <- reactive({
    iris1<- as.data.table(iris)
    iris1[,.(input$xcol, input$ycol),]
  })
  
  clusters <- reactive({
    kmeans(selectedData(), input$clusters)
  })
  
  output$plot1 <- renderPlot({
    palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3",
              "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999"))
    
    par(mar = c(5.1, 4.1, 0, 1))
    plot(selectedData(),
         col = clusters()$cluster,
         pch = 20, cex = 3)
    points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
  })
  
  
}

shinyApp(ui=ui,server=server)

library(data.table)
x <- data.table(a = 1, b = 2)

var <- "a"
x[, var]
#> Error in `[.data.table`(x, , var): j (the 2nd argument inside [...]) is a single symbol but column name 'var' is not found. Perhaps you intended DT[, ..var]. This difference to data.frame is deliberate and explained in FAQ 1.1.
x[, ..var]
#>    a
#> 1: 1
x[, var, with = FALSE]
#>    a
#> 1: 1

Created on 2020-10-07 by the reprex package (v0.3.0.9001)

1 Like

Hi Sir ,

Thanks for the reply. Mastering Shiny online version has been great help !!

For the above example used the below code and it worked.

 output$table<-renderTable({
    
    t1<-selectedData()[,.(get(input$xcol),get(input$ycol)),]
    setnames(t1,new=c(input$xcol,input$ycol))
      })

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.