R 如何在列表中对多个表进行排序
有没有办法将一个表中的一列与另一个表中的同一列进行排序?例如,在下面的代码中,我用mtcars数据绘制了两个数据表,我想通过单击对第一个表的列mpg进行排序,在第二个表中自动显示相同的排序,如果我单击第二个表,则相同,自动对第一个表进行排序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()
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
}
})
}