像字符一样打印,但在 Shiny 和 DataTable 中像数字一样排序

Posted

技术标签:

【中文标题】像字符一样打印,但在 Shiny 和 DataTable 中像数字一样排序【英文标题】:Printing like a character but sorting like numeric in Shiny and DataTable 【发布时间】:2014-12-21 21:16:37 【问题描述】:

我想对使用美元格式化的 DataTable 列进行排序(因此是一个字符)。我使用scales::dollar() 进行格式化。这会将字段转换为导致排序问题的字符(例如,"$8" > "$10")。

如何像数字一样对字段进行排序?或者,我可以将字段保留为数字并仅使用美元格式打印吗?

app.R(需要 Shiny 0.10.2)

server <- function(input, output) 
  output$foo_table <- renderDataTable(
    x <- seq(8000, 12000, by = 1000)
    x <- scales::dollar(x)
    d <- data.frame(x, stringsAsFactors = FALSE)
    d
  )


ui <- shinyUI(fluidPage(
    mainPanel(dataTableOutput("foo_table"))
  )
)

shinyApp(ui = ui, server = server)

【问题讨论】:

【参考方案1】:

有点晚了,但DT Package 现在有格式函数,包括formatCurrency:

# format the columns A and C as currency, and D as percentages
datatable(m) %>% formatCurrency(c('A', 'C')) %>% formatPercentage('D', 2)

从功能页面:

在底层,这些格式化函数只是 rowCallback 选项的包装器,用于生成适当的 javascript 代码。 同样,有一个 formatDate() 函数可用于格式化日期/时间列。它有一个方法参数,该参数从可能的转换方法列表中获取值:toDateString、toISOString、toLocaleDateString、toLocaleString、toLocaleTimeString、toString、toTimeString、toUTCString。

【讨论】:

【参考方案2】:

从 DataTables 1.10 开始,您应该能够使用货币 http://datatables.net/reference/option/columns.type 进行排序。在选项中,给列索引零一个type = 'num-fmt' 就足够了。这将对应于`options.xml 中的columnDefs = list(list(targets = c(0), type = "num-fmt"))。 以下应该有效,但不适用于我:

library(shiny)
server <- function(input, output) 
  output$foo_table <- renderDataTable(
    x <- seq(8000, 12000, by = 1000)
    x <- scales::dollar(x)
    d <- data.frame(x)
    d
  
  , options = list(
    columnDefs = list(list(targets = c(0), type = "num-fmt"))
  )
  )


ui <- shinyUI(fluidPage(
  mainPanel(dataTableOutput("foo_table"))
)
)

shinyApp(ui = ui, server = server)

也许@yihui 可以解释一下这个问题。

【讨论】:

renderDataTable 的这个选项是我正在寻找的东西的类型。无法弄清楚为什么这不起作用。也许这可以通过文字 JavaScript 来完成?【参考方案3】:

gtools 包中的混合排序和混合排序函数可以做到这一点:

x <- seq(8000, 12000, by = 1000)
x <- scales::dollar(x)
d <- data.frame(x)

 mixedsort(d$x) # not much of a test but also give same results with mixedsort(rev(d$x))

[1] $8,000  $9,000  $10,000 $11,000 $12,000
Levels: $10,000 $11,000 $12,000 $8,000 $9,000

请注意,您的 data.frame 调用创建了因子。您可能不希望这样,如果不希望包含 stringsAsFactors=FALSE。我在帮助页面中没有看到任何关于逗号的提及,因此您可能需要在 mixedsort 之前应用 gsub("[,]", "", d$x)

【讨论】:

gtools::mixedsort() 看起来很方便。但这并不能解决让 Shiny 中的 dataTable 正确排序的问题。 对不起。我不是一个经验丰富的 Shiny 用户来解析该语句

以上是关于像字符一样打印,但在 Shiny 和 DataTable 中像数字一样排序的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny:使用来自反应函数的数据制作反应图

如何在 Shiny 中的其他标签上使用 HTML 标签?

如何在 R Shiny 中翻页

QWebEnginePage 打印到 PDF 不会像 Google Chrome 一样打印 PDF 中的可选文本

如何访问/打印/跟踪 Shiny 应用程序中的当前选项卡选择?

像 cat 一样的 C 实现,具有鲁棒性和效率