2016-07-14 10 views
2

Ich habe eine data.table mit 3 Spalten.Ändern Sie die Farbe einer Zeile basierend auf anderen Spalte mit DT - Shiny - R

trial <- matrix(c(3,4,1,2,1,2,4,2,5), ncol=3) 
colnames(trial) <- c('value', 'min', 'max') 
trial.table <- data.table(trial) 

Mit R (Glänzendes und DT), würde Ich mag die Schriftfarbe des Spalt Wertes ändern basierend auf der minimalen und maximalen Bereich.

Ich versuche, diese zu nutzen:

datatable(trial.table, rownames = FALSE) %>% 
formatStyle('value', color = styleInterval(c(trial.table$min,trial.table$max), c('orange', 'green', 'red'))) 

aber es gibt mir zurück:

Error in styleInterval(c(trial.table$min, trial.table$max), c("orange", : 
    length(cuts) must be equal to length(values) - 1 

Das Ergebnis sollte sein:

Spalte "Wert" mit den Werten: 3 mit Farbe grün, 4 mit Farbe rot und 1 mit Farbe orange.

Es funktioniert, wenn statt c(trial.table$min,trial.table$max) wir Zahlen verwenden - c(1,2) ...

Vielen Dank!

+0

Also, wenn ich das richtig verstehen, wollen Sie die erste Zeile, um Stil basierend auf der minimalen und maximalen Wert in dieser Zeile, dann für die nächste Zeile wollen Sie aus dieser Zeile mit dem Min- und Max-Wert stylen, und bald. – Carl

+0

@Carl ist. Die Spalte "Wert" ändert den Stil basierend auf den Min- und Max-Werten der Korrespondenzzeile. Danke – DemetriusRPaula

Antwort

2

Die Lösung ist die Verwendung von rowCallback statt styleInterval.

trial <- matrix(c(3,4,1,2,1,2,4,2,5), ncol=3) 
colnames(trial) <- c('value', 'min', 'max') 
trial.table <- data.frame(trial) 


DT::datatable(trial.table,options = list(rowCallback = JS(' 
         function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
         if (parseFloat(aData[1]) < aData[2]) 
         $("td:eq(1)", nRow).css("color", "orange"); 
         if (parseFloat(aData[1]) <= aData[3] && parseFloat(aData[1]) >= aData[2]) 
         $("td:eq(1)", nRow).css("color", "green"); 
         if (parseFloat(aData[1]) > aData[3]) 
         $("td:eq(1)", nRow).css("color", "red"); 
         }'))) 
+0

Könnten Sie vielleicht ein paar Kommentare zu Ihrer Antwort hinzufügen. Z.B. Warum gibt es 'parseFloat()' um die erste Variable in den if-Anweisungen? Was bedeuten die JS-Funktionsargumente? Verstehe ich richtig, dass 'td: eq (1)' bezieht sich auf die Spalte Nummer == 1. - Dank von einem Nicht-JS-Coder – Jim

Verwandte Themen