在R ShinyProxy中,在用户使用extensions = 'ColReorder'重新排序DT::datatable中的列之后,如何获得它们的顺序?

juud5qan  于 2022-12-25  发布在  其他
关注(0)|答案(3)|浏览(116)

我在ShinyProxy中有一个需要用户登录才能访问的应用程序。我在应用程序中有一个DT::datatable,它允许用户重新排序列(大约有20-30列数据,所以重新排序它们是一件痛苦的事情)。如果他们先重新排序列,然后使用任何过滤器/切片器,列将重新排序回默认值;如果用户离开应用程序并重新打开它,则列将恢复默认顺序。
我想给予用户一个“保存列顺序”的操作按钮,然后将每个用户的设置存储在Redis中,这样当他们使用过滤器和/或离开并重新进入应用程序时,他们可以使用自己喜欢的列顺序,而不是我设置的默认列顺序--想让他们更容易!
我发现这个网站(https://rstudio.github.io/DT/shiny.html)让我很接近,但没有雪茄。我想它可能是像input$tableId_columns_allinput$tableId_columns的东西-然而,这些都没有工作/返回NA。
我试过大量的谷歌搜索,我发现大多数看起来能给我答案的东西要么是Python,要么是jQuery,我不相信它们能解决我的问题。
我很乐意接受我所想到的ActionButton + Redis方法或完全不同的想法!我真的只是想在ShinyProxy中保存用户设置。
谢谢你!

n8ghc7c1

n8ghc7c11#

我不知道如何保存/恢复订单,但这里是你可以得到订单的方法:

library(shiny)
library(DT)

js <- c(
  "table.on('column-reorder', function(e, settings, details){",
  "  Shiny.setInputValue('colOrder', details.mapping);",
  "});"
)

ui <- fluidPage(
  br(),
  DTOutput("tbl"),
  br(),
  verbatimTextOutput("columnsOrder")
)

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

  output[["tbl"]] <- renderDT({
    datatable(iris[1:5,], extensions = "ColReorder", 
              callback = JS(js), 
              options = list(
                colReorder = TRUE
              )
    )
  })

  output[["columnsOrder"]] <- renderPrint({
    input[["colOrder"]]
  })

}

shinyApp(ui, server)

exdqitrt

exdqitrt2#

我很晚才提出我的解决方案,但你们中的一些人可能会感兴趣,在这里,我们得到了列标题的最终名称。

library(shiny)
library(DT)

newjs <- 'table.on("column-reorder", function(e, settings, details){
    var table = document.getElementById("tbl");
    var thead = table.getElementsByTagName("thead");
    var ths = thead[0].getElementsByTagName("th");
    var tableFields = [];
    for (let i = 0; i < ths.length; i++) {
        tableFields[i] = ths[i].innerHTML;            
    }
    Shiny.onInputChange("colOrder", tableFields); 
});
'

ui <- fluidPage(
  br(),
  DTOutput("tbl"),
  br(),
  verbatimTextOutput("columnsOrder")
)

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

  output[["tbl"]] <- renderDT({
    datatable(iris[1:5,], extensions = "ColReorder", 
              callback = JS(newjs), 
              options = list(
                colReorder = TRUE
              )
    )
  })

  output[["columnsOrder"]] <- renderPrint({
    input[["colOrder"]]
  })

}

shinyApp(ui, server)
rjjhvcjd

rjjhvcjd3#

datableoptions中使用stateSave = TRUE也可能是一个解决方案。

相关问题