Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在列表中对多个表进行排序_R_Sorting_Shiny_Datatable_Dt - Fatal编程技术网

R 如何在列表中对多个表进行排序

R 如何在列表中对多个表进行排序,r,sorting,shiny,datatable,dt,R,Sorting,Shiny,Datatable,Dt,有没有办法将一个表中的一列与另一个表中的同一列进行排序?例如,在下面的代码中,我用mtcars数据绘制了两个数据表,我想通过单击对第一个表的列mpg进行排序,在第二个表中自动显示相同的排序,如果我单击第二个表,则相同,自动对第一个表进行排序 library(DT) library(shiny) ui <- basicPage( h2("The mtcars data"), dataTableOutput("mytable"), br()

有没有办法将一个表中的一列与另一个表中的同一列进行排序?例如,在下面的代码中,我用mtcars数据绘制了两个数据表,我想通过单击对第一个表的列mpg进行排序,在第二个表中自动显示相同的排序,如果我单击第二个表,则相同,自动对第一个表进行排序

library(DT)
library(shiny)

ui <- basicPage(
  h2("The mtcars data"),
  dataTableOutput("mytable"),
  br(),
  dataTableOutput("mytable2")
)

server <- function(input, output) {
  output$mytable = DT::renderDataTable({
    mtcars
  })
  output$mytable2 = DT::renderDataTable({
    mtcars
  })
}

shinyApp(ui, server)
库(DT)
图书馆(闪亮)

ui我尝试将
stateSave
选项与
datatable
一起使用,我相信这可能会有所帮助。
order
选项可以保存在
reactiveValues
中,并在任一表的顺序更改时更新。在更改
reactiveValues
之前,我确保这是对存储顺序的更改,否则您可能会对
数据表进行重复更新。最后,由于状态将保存在localStorage中,因此添加
stateDuration=-1
将防止用户再次访问应用程序时进行额外的排序

server <- function(input, output, session) {
  
  rv <- reactiveValues(
    options = list(stateSave = TRUE,
                   stateDuration = -1,
                   order = list())
  )
  
  output$mytable = DT::renderDataTable({
    datatable(mtcars, options = rv$options)
  })
  
  output$mytable2 = DT::renderDataTable({
    datatable(mtcars, options = rv$options)
  })
  
  observeEvent(input$mytable_state$order, {
    if (!identical(rv$options$order, input$mytable_state$order)) {
      rv$options$order <- input$mytable_state$order
    }
  })
  
  observeEvent(input$mytable2_state$order, {
    if (!identical(rv$options$order, input$mytable2_state$order)) {
      rv$options$order <- input$mytable2_state$order
    }
  })
  
}
或者,如果您想在
数据表
中添加
选项
,并且可能在两个表之间使用不同的选项,您可以将
顺序
存储在
rv
中:

server <- function(input, output, session) {
  
  rv <- reactiveValues(
    order = list()
  )
  
  output$mytable = DT::renderDataTable({
    datatable(mtcars, options = list(
      stateSave = TRUE,
      stateDuration = -1,
      order = rv$order))
  })
  
  output$mytable2 = DT::renderDataTable({
    datatable(mtcars, options = list(
      stateSave = TRUE,
      stateDuration = -1,
      order = rv$order))
  })
  
  observeEvent(input$mytable_state$order, {
    if (!identical(rv$order, input$mytable_state$order)) {
      rv$order <- input$mytable_state$order
    }
  })
  
  observeEvent(input$mytable2_state$order, {
    if (!identical(rv$order, input$mytable2_state$order)) {
      rv$order <- input$mytable2_state$order
    }
  })
  
}

服务器正常工作,谢谢!如果我想在renderDataTable中包含更多选项,我应该怎么做?@Joselus很棒-很高兴听到这个消息。请参阅我编辑的答案,其中描述了两种方法。
server <- function(input, output, session) {
  
  rv <- reactiveValues(
    order = list()
  )
  
  output$mytable = DT::renderDataTable({
    datatable(mtcars, options = list(
      stateSave = TRUE,
      stateDuration = -1,
      order = rv$order))
  })
  
  output$mytable2 = DT::renderDataTable({
    datatable(mtcars, options = list(
      stateSave = TRUE,
      stateDuration = -1,
      order = rv$order))
  })
  
  observeEvent(input$mytable_state$order, {
    if (!identical(rv$order, input$mytable_state$order)) {
      rv$order <- input$mytable_state$order
    }
  })
  
  observeEvent(input$mytable2_state$order, {
    if (!identical(rv$order, input$mytable2_state$order)) {
      rv$order <- input$mytable2_state$order
    }
  })
  
}