vladli
vladli

Reputation: 1573

Get selected row value instead of number

I know I can access selected rows by input$dfname_rows_selected it gives back the numbers of rows selected, but how do I read the rows names, not numbers? In my case they are generated not in the order I use them later, therefore I need to get the values inside to make it work.

ui <- shinyUI(fluidPage(

  DT::dataTableOutput("table"),
  actionButton("btn", "press me")
  
))

server <- function(input, output) {
  observeEvent(input$btn, {
    print(input$table_rows_selected)
  })
  
  output$table <- DT::renderDataTable({
    
    mtcars %>%
      datatable(selection = "multiple")
    
  })
  
}
shinyApp(ui = ui, server = server)

Upvotes: 4

Views: 6564

Answers (2)

Florian
Florian

Reputation: 25435

I don't think you can. What you could do is write a reactive, where all modifications to your dataframe take place, before creating the datatable. An example:

library(shiny)
library(DT)

ui <- shinyUI(fluidPage(
  DT::dataTableOutput("table"),
  textOutput("selectedcar")
)
)

server <- function(input, output,session) {
  
  # the reactive where we filter/sort/modify the data
  reactive_df <- reactive({
    mtcars[order(mtcars$cyl),]
    })
  
  # This datatable uses the reactive directly, so no more modifications
  output$table <- DT::renderDataTable({
    DT::datatable(reactive_df())
    })
  
  # now we can get the row/rowname as follows:
  output$selectedcar <- renderText({
    paste0(rownames(reactive_df())[input$table_rows_selected], collapse = ", ")
  }) 
} 


shinyApp(ui, server)

Upvotes: 1

Pork Chop
Pork Chop

Reputation: 29417

Something like this:

library(shiny)
library(DT)

ui <- basicPage(
  mainPanel(DT::dataTableOutput('mytable')),
  textOutput("selected")
)

server <- function(input, output,session) {

  mydata <- reactive({mtcars})

  output$mytable = DT::renderDataTable(    
    datatable(mydata())
  ) 

  selectedRow <- eventReactive(input$mytable_rows_selected,{
    row.names(mtcars)[c(input$mytable_rows_selected)]
  })

  output$selected <- renderText({ 
    selectedRow()
  })
}
runApp(list(ui = ui, server = server))

Upvotes: 4

Related Questions