2014-10-26 39 views
5

我想排序格式化为美元(因此是一个字符)的DataTable列。我已经使用scales::dollar()进行格式化。这将字段转换为导致排序问题的字符(例如,"$8" > "$10")。打印就像一个字符,但像Shiny和DataTable中的数字排序

如何将字段排序为数字?或者,我可以将字段保留为数字,只需使用美元格式打印?

app.R(需要闪亮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。

1

在包gtools的mixedsort和mixedorder功能,可以这样做:你data.frame调用创建

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 

公告因素。你可能不想要那个,如果不是,应该包含stringsAsFactors = FALSE。我在帮助页面中看不到有关逗号的任何提及,因此您可能需要在mixedsort之前应用gsub("[,]", "", d$x)

+0

'gtools :: mixedsort()'看起来非常方便。但是这并不能解决让Shiny中的dataTable正确排序的问题。 – davechilders 2014-10-27 02:04:38

+0

对不起。我不是一个足够有经验的Shiny用户来解析这个声明 – 2014-10-27 02:53:33

1

从DataTables 1.10开始,您应该可以使用货币http://datatables.net/reference/option/columns.type进行排序。在选项中,应该足够给type = 'num-fmt'列索引零。这在`选项中对应于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可以摆脱对这个问题的一些情况。

+0

'renderDataTable'这个选项是我正在寻找的东西的类型。无法弄清楚为什么这不起作用。也许这可以通过文字JavaScript来完成? – davechilders 2014-10-27 13:16:30