Search code examples
rdatatablesshinycelldt

Get cell value next to clicked cell in Shiny DT


My Shiny App renders DT frame in DT aka DataTables. I know how to get value of clicked cell by adding suffix:

_cell_clicked

For example:

print(unlist(( input$renderMpaDtOutput_cell_clicked  )))

returns named list object:

row   col value 
  1     9  3929

But I want to get cell value next to clicked cell (for example next to above coordinates: (row,col) = (1,9)).

Any ideas?


Solution

  • Just by adding coordinates to the row and col value, respectively. Take the table that was used to create the datatable, get input$dt_cell_clicked$row and $col and ask for table[input$dt_cell_clicked$row + 1, input$dt_cell_clicked$col] or vice versa. Example app:

    library(shiny)
    
    ui <- fluidPage(
     numericInput("x", "how many cells to the left/right?", min=-5, max=5, value=0),
     numericInput("y", "how many cells to the top/bottom?", min=-5, max=5, value=0),
     DT::dataTableOutput("dt"),
     uiOutput("headline"),
     verbatimTextOutput("shifted_cell")
    )
    
    server <- function(input, output) {
    
      output$headline <- renderUI({
        h3(paste0("You clicked value ", input$dt_cell_clicked$value, ". ", 
                  input$x, " cells to the ", ifelse(input$x > 0, "right", "left"), " and ",
                  input$y, " cells to the ", ifelse(input$y > 0, "bottom", "top"), " is:"))
      })
      # the value of the shifted cell
      output$shifted_cell <- renderPrint({
        mtcars[input$dt_cell_clicked$row + input$y, # clicked plus y to the bottom/top
               input$dt_cell_clicked$col + input$x] # clicked plus x to the left/right 
      })
    
      # the datatable
      output$dt <- DT::renderDataTable({
        DT::datatable(mtcars, select="none")})
    }
    
    shinyApp(ui, server)
    

    enter image description here