firmo23
firmo23

Reputation: 8404

Store values based on multiple data table cell selection in a data frame

I have a shiny app with two data tables. The first one permits multiple cell selection while the 2nd one single. Every cell value should be stored inside list_all() and then displayed as a new table. The issue is that from the 1st table only the last cell selection is stored instead of every selection.

library(shiny)
library(DT)
data("mtcars")

ui <- shinyUI(
  fluidRow(
    DT::dataTableOutput("myDatatable"),
    DT::dataTableOutput("myDatatable2"),
    DT::dataTableOutput("myDatatable3")

  )

)

server <- shinyServer(function(input, output, session) {
  output$myDatatable <- DT::renderDataTable(matrix(iris[,5]), 
                                            selection=list( target="cell"),
                                            server = FALSE,
                                            rownames=FALSE)
  output$myDatatable2 <- DT::renderDataTable(matrix(iris[c(25,78,67,45,90,66,78,9,8),5]), 
                                             selection=list(mode="single", target="cell"),
                                             server = FALSE,
                                             rownames=FALSE)
  list_all <- reactive({
    x <- c(input$myDatatable_cell_clicked$value, input$myDatatable2_cell_clicked$value)

  })

  output$myDatatable3 <- DT::renderDataTable(matrix(list_all()) 
                                             )
})

shinyApp(ui, server)

Upvotes: 1

Views: 150

Answers (1)

St&#233;phane Laurent
St&#233;phane Laurent

Reputation: 84529

Something like this?

library(shiny)
library(DT)
data("mtcars")

ui <- shinyUI(
  fluidRow(
    DTOutput("myDatatable"),
    DTOutput("myDatatable2"),
    DTOutput("myDatatable3")
  )
)

server <- function(input, output, session) {
  output$myDatatable <- renderDT(matrix(iris[,5]), 
                                 selection=list( target="cell"),
                                 server = FALSE,
                                 rownames=FALSE)
  output$myDatatable2 <- renderDT(matrix(iris[c(25,78,67,45,90,66,78,9,8),5]), 
                                  selection=list(mode="single", target="cell"),
                                  server = FALSE,
                                  rownames=FALSE)

  list_all <- reactiveVal(character())
  observeEvent(input$myDatatable_cell_clicked, {
    list_all(append(list_all(), input$myDatatable_cell_clicked$value))
  })
  observeEvent(input$myDatatable2_cell_clicked, {
    list_all(append(list_all(), input$myDatatable2_cell_clicked$value))
  })

  output$myDatatable3 <- renderDT(matrix(list_all()))
}

shinyApp(ui, server)

Upvotes: 2

Related Questions