2015-10-16 18 views
5

Ich habe eine Shiny-App, die eine Datentabelle mit dem DT -Paket anzeigt. Ich möchte Spalten in einer benutzerdefinierten Weise formatieren können. Zum Beispiel möchte ich, dass ein Währungswert wie folgt angezeigt wird: 1.234,50 € anstelle des DT -ways, der es wie folgt anzeigt: 1.234,5 $ (beachten Sie die Änderung des Symbols, die Position des Währungssymbols sowie die Zahlen nach dem Komma).DT in Shiny und R: Benutzerdefinierte Zahlenformatierung

Ein MWE sieht wie folgt aus:

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) 
    ) 
    } 
) 

Es ist eine ziemlich gute Arbeit geleistet, aber wenn das Währungssymbol zu ändern, das Symbol verschwindet. Wenn Sie ein anderes Zeichen wie "E" einfügen, wird das Zeichen immer noch am Anfang und nicht am Ende angezeigt. Außerdem erhält der numerische Wert keine "große Markierung".

Irgendwelche Ideen?

+2

Für numerische könnten Sie versuchen: 'formatCurrency ('num', currency =" ", interval = 3, mark =", ", digits = 0)'. Für Euro, 'formatCurrency (c ('cur'), ​​Währung =" € ", interval = 3, mark =", ", digits = 1)'. Ich bin mir nicht sicher, wie man es richtig macht, aber – Chris

+0

Der 'formatCurrency'-Ansatz, um 1000 zu bekommen, ist gut! Allerdings sehe ich immer noch kein € -Zeichen für die Währungsnummer. Gleiches gilt, wenn ich '\ U20AC' statt' '' verwende, wie in '? FormatCurrency' vorgeschlagen. – David

Antwort

2

Sie können die Position des Währungssymbols in der .js-Datei aus dem Datenpaket ändern.

Bearbeiten Sie die Zeile der DTWidget.formatCurrency Funktion

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

einfach

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

im DT/htmlwidgets/datatables.js Datei im Verzeichnis Ihrer R librarys.

Was das € Symbol,

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

für mich nicht funktioniert, das ist, was Sie versucht haben und Sie kein Symbol sehen?

+0

Interessanter Ansatz. Ich müsste die Bibliotheksrichtung auf andere Maschinen kopieren, wenn ich die gleichen Ergebnisse erzielen möchte. – David

+1

Ja, Sie müssten diese Bibliothek mit jeder Maschine verbinden, auf einem Server nur diese Bibliothek laufen. Auch nach jedem DT-Paket-Update müssten Sie den Code anpassen. Also das ist irgendwie gimmiky, du könntest dies dem Entwicklungsteam auf https://github.com/rstudio/DT vorschlagen, um eine Option im r-Code zu implementieren, um das Währungssymbol zu arrangieren, da dies sehr einfach anzupassen ist im nächsten Update abgeholt. – Sebastian

+1

In Bezug auf die letztere Lösung: Wenn ich 'ShinyApp (ui = fluidPage (DT :: dataTableOutput ('tbl')) eingeben), Server = Funktion (Eingabe, Ausgabe) {dat <- data.frame (cur = 1234.5) Ausgabe $ tbl = DT :: renderDataTable ( Datentabelle%)% formatCurrency (c ('cur'), ​​Währung = "\ U20AC", interval = 3, mark = ",", digits = 2) ) } } 'Ich bekomme einen Fehler, dass' Ziffern' ist ein unbenutztes Argument ... Ohne das 'Ziffern' Argument sehe ich immer noch nicht das Währungssymbol. [Siehe hier] (http://puu.sh/kShhA/0398a4e597.png) – David