Meine Schlussfolgerung ist, dass Sie nicht 2 Formatierer zu der gleichen Spalte mit DT
hinzufügen können, obwohl ich natürlich falsch liegen könnte.
Beachten Sie, dass, selbst wenn dies nicht explizit in der Dokumentation DT
angegeben ist, nur ein Formatierer pro Spaltentabelle hinzugefügt werden kann. Beachten Sie außerdem, dass die Beispiele in der von Ihnen angegebenen Verknüpfung oder bei der Eingabe von ?formatCurrency
, wenn sie zwei Pipes %>%
enthalten, immer auf zwei verschiedene Spalten wirken.
In Ihrem Beispiel, wenn Sie
tun
datatable(m) %>% formatRound("A", digits=1) %>% formatCurrency("A", currency="£")
das Ergebnis Runde 1 Ziffer ohne Währung, und wenn Sie das tun
datatable(m) %>% formatCurrency("A", currency="£") %>% formatRound("A", digits=1)
das Ergebnis ist die Währung ohne Rundung hinzugefügt.
Mein Wissen darüber, wie R mit js integriert sehr begrenzt ist, sondern an der R Quellen für the package in cran suchen, es sieht aus wie jeder Format-Befehl in dem Rohr anhängt einen Formatierer, aber aus irgendeinem Grunde nur eine Formatierer ins Spiel kommt:
formatCurrency = function(table, columns, currency = '$', interval = 3, mark = ',') {
formatColumns(table, columns, tplCurrency, currency, interval, mark)
}
formatRound = function(table, columns, digits = 2) {
formatColumns(table, columns, tplRound, digits)
}
formatColumns = function(table, columns, template, ...) {
...
x$options$rowCallback = appendFormatter(
x$options$rowCallback, columns, colnames, rownames, template, ...
)
...
}
appendFormatter = function(js, name, names, rownames = TRUE, template, ...) {
...
JS(append(
js, after = 1,
template(i, ...)
))
}
wo jeder Formatierer bis endet formatColumns
mit einer anderen template
Aufruf und i
lösen eine ID für die Spalte. Wie gesagt, ich habe keine Ahnung, ob das daran liegt, dass die append-Operationen den Formatierer überschreiben, oder ob es mit der Ausführung zu tun hat.
EDIT: Sorry, ich versehentlich die Post-Taste gedrückt und bekam interruped. Ich habe tatsächlich einen Formatierer implementiert, der mehr Argumente benötigt.Die Lösung ist ein wenig verworren, aber es funktioniert. Dies ist ein Formatierer, der sowohl Währung und Ziffern akzeptiert:
tplRound2 = function(cols, currency, digits) {
sprintf(
"var d = parseFloat(data[%d]); $(this.api().cell(row, %s).node()).html(isNaN(d) ? '' : '%s' + d.toFixed(%d).toString());",
cols, cols, currency, digits
)
}
Sie müssen all diese Funktionen zu Ihrer Sitzung hinzuzufügen:
formatRound2 = function(table, columns, currency, digits = 2) {
formatColumns2(table, columns, tplRound2, currency, digits)
}
formatColumns2 = function(table, columns, template, ...) {
if (inherits(columns, 'formula')) columns = all.vars(columns)
x = table$x
colnames = base::attr(x, 'colnames', exact = TRUE)
rownames = base::attr(x, 'rownames', exact = TRUE)
x$options$rowCallback = appendFormatter2(
x$options$rowCallback, columns, colnames, rownames, template, ...
)
table$x = x
table
}
name2int = function(name, names) {
if (is.numeric(name)) {
return(if (all(name > 0)) name else seq_along(names)[name])
}
names = setNames(seq_along(names), names)
unname(names[name])
}
appendFormatter2 = function(js, name, names, rownames = TRUE, template, ...) {
js = if (length(js) == 0) c('function(row, data) {', '}') else {
unlist(strsplit(as.character(js), '\n'))
}
i = name2int(name, names)
if (is.character(name) || (is.numeric(name) && !rownames)) i = i - 1
if (any(is.na(i))) stop(
'You specified the columns: ', paste(name, collapse = ', '), ', ',
'but the column names of the data are ', paste(names, collapse = ', ')
)
JS(append(
js, after = 1,
template(i, ...)
))
}
Und dann können Sie mit dem neuen Formatierungsprogramm führen Sie das gewünschte Ergebnis zu erhalten :
datatable(m) %>% formatRound2("A", "£", digits=1)
(Allerdings bedeutet dies die ,
alle 3 Ziffern nicht hinzufügen, wenn Sie es wirklich brauchen ich es an den Formatierer hinzufügen könnte ...)
EDIT2 nach Kommentaren:
Dies wäre die Formafunktion für beide Währung und die Anzahl der Ziffern, sowie die ‚‘ Marken:
tplRound3 = function(cols, currency, digits, interval, mark) {
sprintf(
"var d = parseFloat(data[%d]); $(this.api().cell(row, %s).node()).html(isNaN(d) ? '' : '%s' + d.toFixed(%d).toString().replace(/\\B(?=(\\d{%d})+(?!\\d))/g, '%s'));",
cols, cols, currency, digits, interval, mark
)
}
formatRound3 = function(table, columns, currency, digits = 2, interval=3, mark=',') {
formatColumns2(table, columns, tplRound3, currency, digits, interval, mark)
}
Um es zu benutzen, Geben Sie einfach
datatable(m) %>% formatRound3("A", "£", digits=1)
Warum nicht regelmäßig "Runde" zuerst in dieser Spalte und dann Feed zu "Datatable"? – Gopala
Ich möchte nicht die zugrunde liegenden Daten ändern, sondern nur die Art, wie sie angezeigt werden. Außerdem würde ich gerne wissen, was passiert, wenn ich DT benutze. – epo3