Непоследовательное поведение при выборе ячеек в DT datatable - PullRequest
1 голос
/ 08 ноября 2019

У меня есть блестящее приложение ниже, в котором пользователь нажимает на ячейку в верхней таблице, и соответствующая ячейка должна отображаться в нижней таблице. Проблема в том, что когда я отменяю выбор ячеек в верхнем, ячейки в нижнем не только остаются, но становятся больше.

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

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

  )

)

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


  dat1 <- reactive({
    matrix(iris[,5])
  })


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



  output$myDatatable <- DT::renderDataTable(dat1(), 
                                            selection=list( target="cell"),
                                            server = FALSE,
                                            rownames=FALSE)
  output$myDatatable2 <- DT::renderDataTable(matrix(list_all()), 
                                             selection="none",
                                             server = FALSE,
                                             rownames=FALSE)

})

shinyApp(ui, server)

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Вот еще одна версия, основанная на input$myDatatable_cells_selected с использованием reactive над reactiveVal (всегда должно быть предпочтительным способом в блестящем) + это работает для нескольких столбцов.

library(shiny)
library(DT)
library(datasets)

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

server <- shinyServer(function(input, output, session) {
  dat1 <- reactive({
    data.frame(iris[, 5])
  })

  selected <- reactive({
    req(input$myDatatable_cells_selected)
    selected <- input$myDatatable_cells_selected
    selected[, 2] <- selected[, 2] + 1
    return(selected)
  })

  output$myDatatable <- DT::renderDataTable(
    dat1(),
    selection = list(target = "cell"),
    server = FALSE,
    rownames = FALSE
  )

  output$myDatatable2 <- DT::renderDataTable(
    data.frame(dat1()[selected()]),
    selection = "none",
    server = FALSE,
    rownames = FALSE)
})

shinyApp(ui, server)
1 голос
/ 08 ноября 2019

Пожалуйста, попробуйте ниже:

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

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

    )

)

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


    dat1 <- reactive({
        matrix(iris[,5])
    })


    list_all <- reactiveVal(character())
    observeEvent(input$myDatatable_cells_selected, {
        if (nrow(input$myDatatable_cells_selected) == 0) {
            list_all(character())
        } else {
            list_all(dat1()[input$myDatatable_cells_selected[,1]])
        }
    })



    output$myDatatable <- DT::renderDataTable(dat1(), 
                                              selection=list( target="cell"),
                                              server = FALSE,
                                              rownames=FALSE)
    output$myDatatable2 <- DT::renderDataTable(matrix(list_all()), 
                                               selection="none",
                                               server = FALSE,
                                               rownames=FALSE)

})

shinyApp(ui, server)

Основным отличием является использование input$myDatatable_cells_selected, которое сохраняет выбранные ячейки в отличие от input$myDatatable_cell_clicked, которое содержит ячейку, по которой щелкнули, даже если она не выбрана, что вызывает вашу проблему.

...