如何在 R-Shiny 应用程序中重新排序数据表列名?

How to re-order datatable column names in a R-Shiny App?

我正在编写一个通过数据表显示数据的应用程序。因此会读入来自用户的不同形式的文本文件。通常情况下,这些文件中的列顺序会混淆,但其中的信息是有效的。 显示数据后,我想做一些合理性例程,因此我想说:用“A 列”中的数据做 XY。但是如果有错误的数据(因为列的顺序错误),那么合理性就没有用了。因此,我想重新排序列名,例如:列号。 3 不是 'Column A' 但包含 'column B' 的数据,等等

我现在想做的是重新排序列名,而不是像完成的那样对整个列重新排序 。 使用以下代码我可以移动整个列,但是我如何 仅移动 列名称 ?

编辑: 澄清一下:不,我不想在读入数据时对列进行排序。我想按原样读取文件,只使用数据表对象。这主要是因为我不知道我得到的是一个什么样的文件,里面有什么样的信息。所以我首先想展示里面的东西,然后仔细看看。

library(shiny)
library(DT)

ui <- fluidPage(
      DTOutput("table")
      )

server <- function(input, output, session){
  
    output$table <- renderDT({
    datatable(
      iris,
      rownames = FALSE,
      extensions = "ColReorder",
      options = list(
        colReorder = TRUE
      ),
     colnames = c("S-Length", "S-Width", "P-Length", "P-Width", "Species")
      )
  })
}
 
shinyApp(ui, server)

好吧,我想我自己通过包 shinyjqui 找到了解决方案。

library(shiny)
library(DT)
library(shinyjqui) # of course you need to install the package first, if you've never used it before

ui <- fluidPage(
  shinyjqui::orderInput("order",
                        "some order",
                        items = c("S-Length", "S-Width", "P-Length", "P-Width", "Species")),
  tags$br(),
  DTOutput("table")
)

server <- function(input, output, session){
 
  output$table <- renderDT({
    
    names(iris) <- input$order
    
    datatable(
      iris,
      rownames = FALSE,
      extensions = "ColReorder",
      options = list(
        colReorder = TRUE
      )
    )
  })
}

shinyApp(ui, server)

注意: 使用 names(iris) <- input$order 我直接更改了数据集的列名称,而不仅仅是数据表的名称,因为我想通过其(新)名称进一步访问列。也可以“仅”更改数据表的(显示的)名称。

编辑: 顺便说一句,这里是 Stéphane Laurent 的版本(见上面的答案)模块化,以备不时之需。

library(shiny)
library(shinyjqui)
library(DT)#

ui_modul <- function(id) {
  ns <- NS(id)
  tagList(
    jqui_sortable( DTOutput(ns("dtable")), options = list(items= "thead th"))
  )
}

server_modul <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {
      output[["dtable"]] <- renderDT({
        datatable(head(iris, 5))
      })      
    }
  )
}

ui <- fluidPage(
  br(),
  ui_modul("test")
)

server <- function(input, output, session){
  server_modul("test")
}

shinyApp(ui, server)

您的解决方案有效,但每次您对列名重新排序时都会重新呈现数据表。

这是一个使用 shinyjqui::jqui_sortable 的解决方案,当对列名称进行排序时,数据表不会重新呈现:

library(shiny)
library(shinyjqui)
library(DT)


ui <- fluidPage(
  br(),
  DTOutput("dtable")
)

server <- function(input, output, session){
  
  output[["dtable"]] <- renderDT({
    datatable(head(iris, 5))
  })
  
  jqui_sortable("#dtable thead tr")
  
}

shinyApp(ui, server)