我可以通过对其中一个表中的列进行排序来对 R Shiny 中的两个单独的 DT 数据表进行排序吗?

问题描述 投票:0回答:1

我有两个用

DT::datatable()
生成的 Shiny 表。这些桌子具有相同的尺寸。它们来自不同的数据框,但某些表将共享相同的列名称。表格将位于同一页上。

我可以链接两个表,这样如果我对一个表的列进行排序,它就会对第二个表中的同一列(按位置或名称)进行排序吗?需要明确的是,我的意思是通过单击列标题旁边的小按钮按升序或降序对一列中的值进行排序。

例如,如果我对一个表的 Sepal.Width 列进行排序,它将对另一表的同一列进行排序。第一个表还是第二个表先排序并不重要。

我从

这个问题
的答案中学会了如何使用DT::dataTableProxy链接表格的分页。我在
dataTableProxy
下查找选项,但没有看到任何似乎与排序相关的选项。 (
ColReorder
似乎是为了在表中移动列的顺序,而不是按升序或降序值对给定列进行排序。)

library(shiny)
library(DT)

ui <- fluidPage(
  h5("Table 1"),
  DTOutput("table1"),
  h5("Table 2"),
  DTOutput("table2")
)

server <- function(input, output, session) {
  
  output$table1 <- renderDT({
    datatable(
      iris[iris$Species == "setosa", ],
      options = list(
        dom = '<"top" p>',
        pageLength = 6)
    )
  })
  output$table2 <- renderDT({
    datatable(
      iris[iris$Species == "virginica", ],
      options = list(
        dom = "t",
        pageLength = 6)
    )
  })
  
  table1Proxy <- dataTableProxy("table1")
  table2Proxy <- dataTableProxy("table2")
  
  observeEvent(input$table1_rows_current, {
    selectPage(table2Proxy, page = ceiling(max(input$table1_rows_current) / input$table1_state$length))
  })
  
  observeEvent(input$table2_rows_current, {
    selectPage(table1Proxy, page = ceiling(max(input$table2_rows_current) / input$table2_state$length))
  })
}

shinyApp(ui = ui, server = server)  

创建于 2023-11-07,使用 reprex v2.0.2

r sorting shiny dt
1个回答
0
投票
library(shiny)
library(DT)

callback <- c(
  "table.on( 'order.dt', function() {",
  "  var order = table.order();",
  "  if(order[0] !== undefined) {",
  "    var M = order.map(function(x) {return x.slice(0,2);});",
  "    var $table2 = $('#table2').find('table');",
  "    var table2 = $table2.DataTable().table();",
  "    table2.order(...M).draw();",
  "  }",
  "});"
)

ui <- fluidPage(
  splitLayout(
    DTOutput("table1"),
    DTOutput("table2")
  )
)

server <- function(input, output) {
  
  output[["table1"]] <- renderDT({
    datatable(iris[iris$Species == "setosa", ], callback = JS(callback))
  })
  
  output[["table2"]] <- renderDT({
    datatable(iris[iris$Species == "versicolor", ])
  })

}

shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.