Shiny App中datatable按绝对值排序第二列的问题求助
Shiny中DT按绝对值排序的解决方案
要实现datatable第二列(val2)按绝对值排序,你之前的尝试方向有误——order参数仅接受列索引和排序方向,不能直接嵌入dplyr函数,以下是两种可行方案:
方案1:新增隐藏绝对值列(简单直观)
通过预处理数据新增val2的绝对值列,将其隐藏后指定为第二列的排序依据:
table_stage <- reactive ({ # 预处理数据,添加val2的绝对值列 data_with_abs <- tabledat() %>% mutate(abs_val2 = abs(val2)) tbl <- datatable(data_with_abs, rownames = FALSE, options = list( columnDefs = list( list(className = "dt-center", targets = 2), list(targets = 3, visible = FALSE), # 隐藏绝对值列 list(orderData = 3, targets = 2) # 让第二列按第三列(绝对值)排序 ), order = list(list(2, "asc")) # 默认按绝对值升序排列 )) %>% formatRound("val", 2) %>% formatRound("val2", 2) return(tbl) })
方案2:自定义DT排序函数(无需新增列)
利用DT的扩展排序功能,注册一个基于绝对值的排序规则:
table_stage <- reactive ({ tbl <- datatable(tabledat(), rownames = FALSE, options = list( columnDefs = list( list(className = "dt-center", targets = 2), list(type = "num-abs", targets = 2) # 指定第二列使用自定义排序类型 ), order = list(list(2, "asc")) ), # 注册自定义排序预处理函数 callback = JS(" $.fn.dataTable.ext.type.order['num-abs-pre'] = function (data) { return Math.abs(parseFloat(data)); }; ") ) %>% formatRound("val", 2) %>% formatRound("val2", 2) return(tbl) })
错误说明
你之前的代码中order = list(list((arrange(abs(2)), "desc")))完全不符合DT的参数规则:
arrange是dplyr的数据处理函数,不能直接用于DT的排序配置abs(2)是计算数字2的绝对值,和列数据毫无关联
内容的提问来源于stack exchange,提问作者nowyouredoingit
相关产品推荐
相关产品推荐

