首页 > 解决方案 > DT 数据表中单元格选择期间的行为不一致

问题描述

我在下面有一个闪亮的应用程序,其中用户单击上表中的一个单元格,相关单元格应显示在下表中。问题是,当我取消选择上部的单元格时,下部的单元格不仅保留下来,而且变得更多。

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)

标签: rshinydt

解决方案


请尝试以下:

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_selectedwhich 保留当前选定的单元格,而不是input$myDatatable_cell_clicked包含单击的单元格,即使未选中,也会导致您的问题。


推荐阅读