在 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】:format
和 prettyNum
的问题在于这些函数生成字符而不是数字。因此,不可能对渲染的表格进行样式设置。
此示例的解决方案可能如下:
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 实现中控制数字格式的主要内容,如果未能解决你的问题,请参考以下文章
Shiny DataTable:使用按钮扩展保存完整的 data.frame
如何在Shiny R中丢弃DT :: datatable上的用户编辑