2017-12-10 3 views
1

私はR Shinyアプリケーションを開発しており、私が提供する色のベクトルに基づいてデータテーブル内の四角形を再描画したいと考えています。動作しないものの簡単な例を以下に示します。数値に基づいてセルやテキストに色付けすることができますが、正確な色を指定する必要があります。どんな助けでも大歓迎です。ここで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) 

答えて

0

は、ソリューションです:

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

rgbcolorsベクトルは、HTMLの準備ができて、色のRGBの定義が含まれています

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

文字列jscodeがためのJavascriptコードです行コールバック:

> 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

パーフェクト。ありがとうございました! – dhp

+0

@dhpよろしくお願いします。チェックマークをクリックして回答を受け入れることができますか? –

+0

これは完璧に動作しますが、私のテーブルの色は正しく分類されません。ここで質問をフォローしてください(https://stackoverflow.com/questions/47740337/how-to-ensure-row-coloring-updates-when-r-shiny-dt-datatable-is-sorted-filtered)。 – dhp

関連する問題