如何使用DT :: datatables对具有科学编号的列进行排序

时间:2017-04-12 07:09:39

标签: r datatables shiny dt

我使用 RStudio DT

获得以下代码
library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(
    DT::dataTableOutput('example')
  ),
  server = function(input, output) {
    output$example <- DT::renderDataTable({
      table = cbind(LETTERS[1:5],c("9.95e-04","9.93e-06","9.93e-02","9.49e-03","9.10e-02"))
      table
    },   options = list(
      columnDefs = list(list(type = "scientific", targets = 1))
    ))
  }
)

但它没有按照我的意图对科学专栏进行排序。什么是正确的方法?

enter image description here

正确的降序应为:

V1         V2
 C     0.0993
 E      0.091
 D    0.00949
 A   0.000995
 B 0.00000993

2 个答案:

答案 0 :(得分:1)

这是我在评论部分提出的第一个解决方案的实现。

xy <- read.table(text = "V1         V2
 C     0.0993
 E      0.091
 D    0.00949
 A   0.000995
 B 0.00000993", header = TRUE, colClasses = c("character", "character"))
xy$V3 <- as.numeric(xy$V2)

xy[order(xy$V3, decreasing = TRUE), c("V1", "V2")]

  V1         V2
1  C     0.0993
2  E      0.091
3  D    0.00949
4  A   0.000995
5  B 0.00000993

修改

您可以尝试使用您的示例。请注意,我使用的是data.frame。 Matrix不适合此解决方案。

output$example <- DT::renderDataTable({
  xy <- data.frame(letter = LETTERS[1:5], value = c("9.95e-04","9.93e-06","9.93e-02","9.49e-03","9.10e-02"))
  xy$num_val <- as.numeric(as.character(xy$value))
  xy[order(xy$num_val, decreasing = TRUE), c("letter", "value")]
}

答案 1 :(得分:0)

您可以使用JavaScript进行格式化:

library(DT)

df <- data.frame(
  V1 = LETTERS[1:5],
  V2 = c(9.95e-04, 9.93e-06, 9.93e-02, 9.49e-03, 9.10e-02)
)

js <- c(
  "function(row, data, displayNum, index){",
  "  var x = data[1];",
  "  $('td:eq(1)', row).html(x.toExponential(2));",
  "}"
)

datatable(
  df, rownames = FALSE, 
  options = list(
    rowCallback = JS(js)
  )
)

enter image description here