Shiny 和 R 中的 DT:自定义数字格式

Posted

技术标签:

【中文标题】Shiny 和 R 中的 DT:自定义数字格式【英文标题】:DT in Shiny and R: Custom number formatting 【发布时间】:2016-01-15 06:05:31 【问题描述】:

我有一个使用 DT-package 显示数据表的闪亮应用程序。我想要的是能够以自定义方式格式化列。例如,我希望货币值显示如下:1,234.50€ 而不是 DT-way,它显示为 $1,234.5(注意符号的变化、货币符号的位置以及数字小数点后)。

MWE 如下所示:

library(shiny)
library(DT)

shinyApp(
  # UI
  ui = fluidPage(DT::dataTableOutput('tbl')),

  # SERVER
  server = function(input, output) 
    dat <- data.frame(cur = 1234.5, # supposed to be displayed as: 1,234.50€ | Bad! 
                                         # displayed as $1,234.5
                      perc = 0.123456, # 12.34% | Good!
                      num = 1000) # 1,000 | Bad! displayed as 1000

    # render DT
    output$tbl = DT::renderDataTable(
      datatable(dat) %>%
        formatCurrency(c('cur'), "$") %>%
        formatPercentage('perc', 2) %>%
        formatRound('num', digits = 0)
    )
  
)

它做得相当好,但是,当将货币符号更改为 时,符号消失了。当插入像“E”这样的另一个字符时,该字符仍然显示在开头而不是结尾。此外,数值不会得到“大标记”。

有什么想法吗?

【问题讨论】:

对于数字,您可以尝试:formatCurrency('num', currency = "", interval = 3, mark = ",", digits = 0)。对于欧元,formatCurrency(c('cur'), currency = "€", interval = 3, mark = ",", digits = 1)。不过我不知道怎么把它放在右边 formatCurrency-获得 1,000 的方法很好!但是,我仍然没有看到货币编号的欧元符号。如果我按照?formatCurrency 中的建议使用\U20AC 而不是,则同样适用 【参考方案1】:

您可以更改数据表包中 .js 文件中货币符号的位置。

编辑DTWidget.formatCurrency函数的行

 $(thiz.api().cell(row, col).node()).html(currency + markInterval(d, interval, mark));

简单的

 $(thiz.api().cell(row, col).node()).html(markInterval(d, interval, mark) + currency);

在 R 库目录中的 DT/htmlwidgets/datatables.js 文件中。

至于€符号,

formatCurrency(c('cur'), currency = "\U20AC", interval = 3, mark = ",", digits = 2)

对我有用,这就是你尝试过的,但你没有看到任何符号?

【讨论】:

有趣的方法。如果我想获得相同的结果,我必须将库方向复制到其他机器吗? 是的,您必须将该库链接到每台机器,当然只能在服务器上运行该库。此外,在每次 DT 包更新后,您都必须调整代码。所以这有点花哨,你可以在github.com/rstudio/DT 上向开发团队建议这个,以便在 r 代码中实现一个选项来排列货币符号,因为这很容易调整,它可能会在下一次更新中被采纳。 关于后一种解决方案:当我输入shinyApp(ui = fluidPage(DT::dataTableOutput('tbl')), server = function(input, output) dat &lt;- data.frame(cur = 1234.5) output$tbl = DT::renderDataTable( datatable(dat) %&gt;% formatCurrency(c('cur'), currency = "\U20AC", interval = 3, mark = ",", digits = 2) ) ) 时,我收到一个错误,digits 是一个未使用的参数...没有digits 参数我仍然看不到货币象征。 See Here 嗯,这有点奇怪,你的代码在我的 windows 机器和 ubuntu 服务器上运行良好。我的包版本是 dplyr_0.4.2 DT_0.1.34 shiny_0.12.2 和 R 版本 3.2.2,也许你必须更新你的包? (使用 sessionInfo() 检查您加载的版本) 仍然没有€符号。我怀疑它与我的机器而不是 R 代码有关...无论如何谢谢!

以上是关于Shiny 和 R 中的 DT:自定义数字格式的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny DT::renderDataTable ...如何在下载的表格中自定义标题

R+Shiny+DT:自动右对齐数字列

自定义DataTables如何在Shiny中显示缺失值

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

渲染 JavaScript 会破坏 R Shiny DT (DataTable) 中的页面导航和反应功能

gvisTables 未在 Shiny 应用程序中呈现