如何使用renderDT强制使用科学计数法

7
我希望DT表格中数字值的行为与使用print输出时相同,格式如下:

options(scipen = -1)
options(digits = 3)
cars/1000000

这里输入图像描述

但是不管有哪些选项,似乎DT都不关心:

这里输入图像描述

我知道print和渲染表格并不相同,但应该有一种方法来做到这一点。我可以使用signifround来限制数字位数,但我会因为超低值而丢失信息,并且这会对高值产生不同的影响。

  • 我想保持值为数字,以便正确排序该列。
  • 如果只有3个数字,则应保持经典形式,否则保持科学计数法。

这是一个最简示例。

library(shiny)
library(DT)
library(dplyr)

options(scipen = -1)
options(digits = 3)

# Define UI for application that draws a histogram
ui <- fluidPage(
   # Application title
   titlePanel("Old Faithful Geyser Data"),
   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
      ),
      # Show a plot of the generated distribution
      mainPanel(
         DTOutput("dt"),
         DTOutput("dt2")
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
   output$dt <- renderDT({cars/1000000})
   output$dt2 <- renderDT({
     mutate_all(cars/1000000, funs(signif(., digits = 1)))
     })
}
# Run the application 
shinyApp(ui = ui, server = server)

有什么线索吗?
2个回答

6

DT包还有一个formatSignif()函数,可以帮助解决这个问题,例如:

output$tbl <- renderDataTable({
    DT::datatable(dat) %>%
        formatSignif(columns = c('speed', 'dist'), digits = 3)
})

你知道是否存在小于0的科学计数法的限制吗?因为这似乎对它们不起作用。有什么想法吗? - HCAI

3

您可以尝试使用rowCallback来使用toExponential JavaScript函数将符号更改为科学计数法。

以下是示例:

library(shiny)
library(DT)
library(dplyr)

# Define UI for application that draws a histogram
ui <- fluidPage(
  # Application title
  titlePanel("Old Faithful Geyser Data"),
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
    ),
    # Show a plot of the generated distribution
    mainPanel(
      DTOutput("dt")
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  output$dt <- renderDT({
    datatable(cars/10,options = list(
      rowCallback = JS(
        "function(row, data) {",
        "for (i = 1; i < data.length; i++) {",
        "if (data[i]>1000 | data[i]<1){",
        "$('td:eq('+i+')', row).html(data[i].toExponential(1));",
        "}",
        "}",
        "}")
    )
    )
  })
}
# Run the application 
shinyApp(ui = ui, server = server)

谢谢。我认为如果我只想要大于1000的值被转换成指数形式,我可以自己编写JS代码(带有一些if语句)。 - Sébastien Rochette
是的,我在示例中添加了一个if语句,以便对于大于1000且小于1的数字使用科学计数法。 - NicE
这很完美。谢谢。 - Sébastien Rochette
两个小的后续问题。很好,我喜欢你的答案并会使用它。第一,是否可能将科学计数法格式化为1.54 E02而不是1.5e2(2位小数和双位指数),其次,将小于1000的数字格式化为2位小数? - Mark
@NicE,如何删除if语句?对不起,我对JS没有了解。谢谢。 - Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接