如何使用renderDT强制使用科学符号

如何使用renderDT强制使用科学符号,r,datatables,shiny,dt,R,Datatables,Shiny,Dt,我希望DT表格中的数值行为与打印输出中的数值行为相同,使用时: options(scipen = -1) options(digits = 3) cars/1000000 但无论有什么选择,DT似乎并不关心: 我知道,print与呈现表格不同,但应该有一种方法来实现这一点。我可以使用signif或round来限制数字,但我会丢失非常低值的信息,这会对高值产生不同的影响 我希望将值保留为数字,以便列可以正确排序 如果只有3位数字,则值应保持经典,如果更多,则应保持科学 这是一个最小的例子

我希望
DT
表格中的数值行为与
打印
输出中的数值行为相同,使用时:

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

但无论有什么选择,DT似乎并不关心:

我知道,
print
与呈现表格不同,但应该有一种方法来实现这一点。我可以使用
signif
round
来限制数字,但我会丢失非常低值的信息,这会对高值产生不同的影响

  • 我希望将值保留为数字,以便列可以正确排序
  • 如果只有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)
库(闪亮)
图书馆(DT)
图书馆(dplyr)
选项(scipen=-1)
选项(数字=3)
#为绘制直方图的应用程序定义UI

ui您可以尝试使用
rowCallback
使用
toExponential
javascript函数将符号更改为scientific

下面是一个例子:

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)
库(闪亮)
图书馆(DT)
图书馆(dplyr)
#为绘制直方图的应用程序定义UI

uiDT
软件包也有一个功能可以帮助实现这一点,例如:

输出$tbl%
formatSignif(列=c('speed','dist'),数字=3)
})

谢谢。如果我只希望将大于1000的值转换为指数,我假设我可以编写自己的JS(使用一些if语句?)。是的,我在示例中添加了一个if,以便对大于1000且小于1的数字使用科学符号。这非常完美。谢谢。两个次要的后续问题很好,我喜欢你的答案,并将使用它。是否也可以将scientific的格式设置为1.54 E02,而不是1.5e2(2位小数和两位数指数),然后设置数字格式