像字符一样打印,但在 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 中像数字一样排序的主要内容,如果未能解决你的问题,请参考以下文章
QWebEnginePage 打印到 PDF 不会像 Google Chrome 一样打印 PDF 中的可选文本