2017-12-10 4 views
1

Ich entwickle eine R Shiny App und möchte Quadrate in einer Datentabelle, basierend auf einem Vektor von Farben, die ich zur Verfügung stelle, neu einfärben. Ein einfaches Beispiel dafür, was nicht funktioniert, ist unten gezeigt. Ich weiß, dass Sie Zellen und Text basierend auf numerischen Werten färben können, aber ich muss die genauen Farben zur Verfügung stellen. Jede Hilfe würde sehr geschätzt werden. HierWie färbt man Text in einer Datentabelle basierend auf einem Vektor von Farben mit R DT Shiny?

libarry(DT) 

# set the colors for each box 
mycolors = c("dodgerblue2","grey","firebrick2") 

# recolor entire row (works) 
DT::datatable(data.frame(src=c(1,2,3),tgt=c("█" ,"█" ,"█")),escape=F) %>% 
formatStyle(columns = 1, color = "red") %>% 
formatStyle(columns = 2, color = "blue") 

# recolor based on mycolors (doesn't work) 
DT::datatable(data.frame(src=c(1,2,3),tgt=c("█" ,"█" ,"█")),escape=F) %>% 
formatStyle(columns = 1, color = "red") %>% 
formatStyle(columns = 2, color = mycolors) 

Antwort

0

ist eine Lösung:

dat <- data.frame(src=c(1,2,3), tgt=c("&#9608;", "&#9608;", "&#9608;")) 
mycolors <- c("dodgerblue2", "grey", "firebrick2") 
rgbcolors <- apply(grDevices::col2rgb(mycolors), 2, 
        function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=","))) 
column <- 2 
jscode <- paste("function(row, data, index) {", 
        sprintf("var colors=%s;\n$(this.api().cell(index, %s).node()).css('color', colors[index]);", 
          sprintf("[%s]", paste(sprintf("'%s'", rgbcolors), collapse=", ")), column), "}", sep="\n") 
datatable(dat, escape=FALSE, 
      options = list(rowCallback=JS(jscode)) 
) 

Der rgbcolors Vektor enthält die RGB-Definitionen der Farben bereit für html:

> rgbcolors 
[1] "rgb(28,134,238)" "rgb(190,190,190)" "rgb(238,44,44)" 

Die Zeichenfolge jscode ist die Javascript-Code für die Zeile Callback:

> cat(jscode) 
function(row, data, index) { 
var colors=['rgb(28,134,238)', 'rgb(190,190,190)', 'rgb(238,44,44)']; 
$(this.api().cell(index, 2).node()).css('color', colors[index]); 
} 

enter image description here

+0

Perfekt. Vielen Dank! – dhp

+0

@dhp Gern geschehen. Können Sie auf das Häkchen klicken, um die Antwort zu akzeptieren? –

+0

Das funktioniert zwar einwandfrei, aber meine Tabellenfarben werden nicht richtig sortiert (in meiner Shiny-App). Folgefrage hier (https://stackoverflow.com/questions/47740337/how-to-ensure-row-coloring-updates-when-r-shiny-dt-datatable-is-sorted-filtered). – dhp

Verwandte Themen