【问题标题】:How to re-order datatable column names in a R-Shiny App?如何在 R-Shiny 应用程序中重新排序数据表列名称?
【发布时间】:2021-08-03 06:55:15
【问题描述】:

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

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

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

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)

【问题讨论】:

  • 这是XY problem吗?为什么不只是在加载文本文件时重新排序列? (dplyr::select 会为你做这件事。)
  • @Limey:不是,不是。我想首先查看“错误”顺序,然后重新排列 data.table(每次拖放)。
  • 嗨@julien.leroux5 是的,这是可能的,感谢您的建议。几天前我已经看过这篇文章,但实际上我想避免这种情况:主要是因为许多不同的人正在使用该应用程序,我认为与“仅仅”移动它们相比,重命名列需要更长的时间。但如果没有人提出解决方案,我可能会重新考虑使用它。

标签: r shiny dt


【解决方案1】:

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

这是一个使用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)

【讨论】:

  • 没错,这也是一种可能。请问您总是使用output[["some_output"]] 而不是output$some_output 是否有特定原因?
  • @micsky output[["some_output"]] 在 RStudio 中有更好的语法高亮。这更具可读性。
【解决方案2】:

好吧,我想我自己通过包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) &lt;- 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)

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多