在 Shiny 的 DataTable 实现中控制数字格式

Posted

技术标签:

【中文标题】在 Shiny 的 DataTable 实现中控制数字格式【英文标题】:Control number formatting in Shiny's implementation of DataTable 【发布时间】:2015-01-31 00:50:59 【问题描述】:

目标

默认情况下,在闪亮的 DataTable 中使用千位分隔符呈现大数字。

问题

文档(对我来说)看起来应该已经显示了千位分隔符。我是否遇到了兼容性问题,还是需要在我的代码中添加更多内容,如果需要,添加什么以及如何添加?

[UPDATE] 还有一个SO question 试图解决闪亮的预格式化数据的排序问题。这个问题尚未解决,但提出了另一条路线 - 预先格式化。这是一条可取的路线吗?如果是,如何正确解决其他 OP 的排序问题?

背景

我正在尝试改进闪亮表的输出以提高可读性。我已成功使用另一个SO question 来冻结标题,但我很难正确格式化数字。

MWE

library(shiny)
runApp(
  list(ui = fluidPage(
    tagList(
      singleton(tags$head(tags$script(src='//cdn.datatables.net/fixedheader/2.1.2/js/dataTables.fixedHeader.min.js',type='text/javascript'))),
      singleton(tags$head(tags$link(href='//cdn.datatables.net/fixedheader/2.1.2/css/dataTables.fixedHeader.css',rel='stylesheet',type='text/css')))
    ), 

    dataTableOutput("mytable")
  )
  , server = function(input, output, session)
    output$mytable <- renderDataTable(iris*1000,
                                      options = list(
                                        pageLength = 50,
                                        language.thousands=",",
                                        initComplete = I("function(settings, json)
                                          new $.fn.dataTable.FixedHeader(this, 
                                            left:   true
                                           );
                                        ")
                                      )
    )
  )
)

文档

查看 DataTable 文档,似乎设置了 language.thousands 应该足够了:

DataTables 的内置数字格式化程序 (formatNumberDT) 用于 格式化表格信息中使用的大数字。

language.thousands

默认情况下,DataTables 将使用指定的字符 language.thousandsDT(反过来,默认情况下是逗号)作为 千位分隔符。

formatNumber

在 formatNumber 中,它有一个可以添加的函数,但是,这对我来说很新,所以我不确定如何在现有代码的上下文中使用这个函数。

$('#example').dataTable( 
  "formatNumber": function ( toFormat ) 
    return toFormat.toString().replace(
      /\B(?=(\d3)+(?!\d))/g, "'"
    );
  ;
 );

浏览器详情

Chrome:版本 39.0.2171.71 m

【问题讨论】:

【参考方案1】:

我知道这是一篇相当老的帖子,但是今天也在努力解决这个问题,所以认为其他人可能会从这个解决方案中获得价值。

由于提出问题,RStudio 发布了DT 软件包(Github 或CRAN)。 乍一看,如何格式化数字并不是很明显,因为它们不是对应的 formatNumber 函数,就像它们的 formatCurrency 一样。解决方法是使用formatCurrency 并将货币参数设置为空。下面的例子。

library(shiny)
library(DT)
runApp(
  list(ui = fluidPage(
    DT::dataTableOutput("mytable")
  ),
  server = function(input, output, session) 
    output$mytable <- DT::renderDataTable(
      DT::datatable(iris*1000, 
                    options = list(pageLength = 50, 
                                   columnDefs = list(list(className = 'dt-left', 
                                                          targets = 0:4)))) %>% 
        formatCurrency(1:4, '')
    )
  
  )
)

【讨论】:

【参考方案2】:

formatprettyNum 的问题在于这些函数生成字符而不是数字。因此,不可能对渲染的表格进行样式设置。 此示例的解决方案可能如下:

  output$tab <- renderDataTable( 
  datatable(mytable) %>%
      formatCurrency(columns = ..., currency = "", interval = 3, mark = ",") %>%
      formatStyle(
      columns = ...,
      color = styleInterval(myThreshold, c("black", "red"))) ) 

【讨论】:

【参考方案3】:

尝试用千位格式格式化您传递给renderDatatable() 的df

df$x <- format(df$x, big.mark=',', scientific=FALSE) 

或者

df$x<-prettyNum(df$x, big.mark = ",")

【讨论】:

以上是关于在 Shiny 的 DataTable 实现中控制数字格式的主要内容,如果未能解决你的问题,请参考以下文章

在 DataTable 输出中使用 Shiny 输入

Shiny:合并 DT::datatable 中的单元格

Shiny DataTable:使用按钮扩展保存完整的 data.frame

如何在Shiny R中丢弃DT :: datatable上的用户编辑

如何在 Shiny 中使用 DataTable Extensions 更改下载文件中的名称?

从 Shiny DataTable 中的单元格获取值