如何在 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)
我正在编写一个通过数据表显示数据的应用程序。因此会读入来自用户的不同形式的文本文件。通常情况下,这些文件中的列顺序会混淆,但其中的信息是有效的。 显示数据后,我想做一些合理性例程,因此我想说:用“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)