2016-07-14 75 views
2

我有data.table 3列。使用DT更改基於其他列的行的顏色 - 閃亮 - 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) 

使用R(Shiny和DT),我想根據最小和最大範圍更改列值的字體顏色。

我試圖用這個:

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

但它給我回:

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

結果應該是:

列 「價值」 的價值觀:3顏色爲綠色,紅色爲4,橙色爲1。

它的工作原理,如果不是c(trial.table$min,trial.table$max)我們使用數字 - c(1,2) ...

非常感謝!

+0

所以,如果我理解正確的話,您要根據該行中的最小和最大的價值風格的第一行,然後下一行,你要使用從該行的最小值和最大值的風格,和等等。 – Carl

+0

@Carl Is。列「值」根據通訊行的最小值和最大值改變樣式。謝謝 – DemetriusRPaula

回答

2

解決方法是使用rowCallback而不是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

你可能會給你的答案增加一些評論。例如。爲什麼在if語句中的第一個變量周圍有'parseFloat()'? JS函數參數代表什麼?我是否正確理解:'td:eq(1)'是指列號== 1. - 感謝非JS編碼器 – Jim