2014-10-26 5 views
5

Ich möchte eine DataTable-Spalte, die mit Dollar formatiert ist (und damit ist ein Zeichen). Ich habe scales::dollar() zum Formatieren verwendet. Dadurch wird das Feld in ein Zeichen konvertiert, das Sortierprobleme verursacht (z. B. "$8" > "$10").Drucken wie ein Zeichen, aber sortieren wie numerisch in Shiny und DataTable

Wie kann ich das Feld so sortieren, als wäre es numerisch? Alternativ kann ich das Feld als numerisch behalten und nur mit Dollar-Formatierung drucken?

app.R (erfordert 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) 

Antwort

1

Ein bisschen spät, aber die DT Package hat jetzt Format Funktionen, einschließlich Formatcurrency:

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

Von der Seite Funktionen:

Unter der Haube sind diese Formatierungsfunktionen Wrapper nur für den rowCallback Option zum Generieren des entsprechenden JavaScript-Codes. In ähnlicher Weise gibt es eine Funktion formatDate(), die zum Formatieren von Datums-/Uhrzeitspalten verwendet werden kann. Es hat ein Methodenargument, das Werte aus einer Liste möglicher Konvertierungsmethoden übernimmt: toDateString, toISoString, toLocaleDateString, toLocaleString, toLocaleTimeString, toString, toTimeString, toUTCString.

1

Der mixedsort und Mixedorder Funktionen im Paket gtools das tun können:

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 

Beachten Sie, dass Ihr data.frame Anruf erstellt Faktoren. Vielleicht möchten Sie das nicht und sollten stringsAsFactors = FALSE enthalten. Ich sehe keine Erwähnung in der Hilfeseite über Kommas, und deshalb möchten Sie möglicherweise eine gsub("[,]", "", d$x) vor der mixedsort anwenden.

+0

'gtools :: mixedsort()' sieht sehr praktisch aus. Aber das löst nicht das Problem, die dataTable in Shiny richtig zu sortieren. – davechilders

+0

Entschuldigung. Ich bin kein ausreichend erfahrener Shiny-Benutzer, um diese Anweisung zu analysieren –

1

Ab DataTables 1.10 sollten Sie in der Lage sein, mit der Währung http://datatables.net/reference/option/columns.type zu sortieren. In den Optionen sollte es genügen type = 'num-fmt' dem Spaltenindex Null zu geben. Dies würde columnDefs = list(list(targets = c(0), type = "num-fmt")) in Optionen entsprechen. Die folgende arbeiten sollte, aber nicht für mich:

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) 

Vielleicht kann @yihui etwas Licht auf die Frage.

+0

Diese Option zu 'renderDataTable' ist die Art von Ding, nach dem ich gesucht habe. Kann nicht herausfinden, warum das nicht funktioniert. Vielleicht kann dies durch JavaScript erreicht werden? – davechilders

Verwandte Themen