Shiny Datatable中Name列排序异常,需按前缀数字排序求助
解决DT表格按字符串中数字排序的问题
方法一:添加隐藏排序列(推荐)
核心思路是提取Name列冒号前的数字作为单独的排序依据列,在表格中隐藏该列,让Name列使用这个隐藏列的规则排序。
修改后的完整代码:
library(shiny) library(DT) dFramex <- data.frame( Name = c('10: Dilbert', '5: Alice', '3: Wally', '24: Ashok', '34: Dogbert'), Motivation = c(62, 73, 3, 99, 52), # 提取冒号前的数字转为整数,作为排序键 SortKey = as.integer(sub("^(\\d+):.*", "\\1", Name)) ) ui <- fluidPage( fluidRow( DT::dataTableOutput(outputId = "my_data_table") ) ) server <- function(input, output, session) { values <- reactiveValues(df = dFramex) output$my_data_table <- DT::renderDataTable({ DT::datatable( values$df, editable = TRUE, escape = FALSE, options = list( dom = 't', columnDefs = list( list(type = 'num', targets = 1), # 隐藏SortKey列(列索引从0开始) list(targets = 2, visible = FALSE), # 指定Name列(第0列)按SortKey列(第2列)排序 list(orderData = 2, targets = 0) ) ) ) }, server = FALSE) } shinyApp(ui, server)
关键说明:
- 新增
SortKey列:用sub正则提取冒号前的数字,转为整数确保数值排序逻辑正确。 - 列配置:通过
visible = FALSE隐藏排序键列,orderData指定Name列的排序依赖隐藏列的数据。
方法二:前端自定义排序函数
不需要修改原始数据,通过JavaScript在前端解析字符串中的数字作为排序依据:
library(shiny) library(DT) dFramex <- data.frame( Name = c('10: Dilbert', '5: Alice', '3: Wally', '24: Ashok', '34: Dogbert'), Motivation = c(62, 73, 3, 99, 52) ) ui <- fluidPage( fluidRow( DT::dataTableOutput(outputId = "my_data_table") ) ) server <- function(input, output, session) { values <- reactiveValues(df = dFramex) output$my_data_table <- DT::renderDataTable({ DT::datatable( values$df, editable = TRUE, escape = FALSE, options = list( dom = 't', columnDefs = list( list(type = 'num', targets = 1), # 为Name列指定自定义排序类型 list(type = 'custom-num', targets = 0) ), # 注册自定义排序预处理函数 initComplete = JS( "function(settings, json) { $.fn.dataTable.ext.type.order['custom-num-pre'] = function(data) { // 拆分字符串提取冒号前的数字 return parseInt(data.split(':')[0], 10); }; }" ) ) ) }, server = FALSE) } shinyApp(ui, server)
关键说明:
- 为Name列指定自定义排序类型
custom-num。 - 通过
initComplete注册排序预处理函数,在排序时自动提取字符串中的数字作为排序值。
两种方法均可实现需求,方法一更适合习惯在R端处理数据的场景,方法二则无需修改原始数据结构。
内容的提问来源于stack exchange,提问作者SmoothGuy25
相关产品推荐
相关产品推荐

