2016-07-14 19 views
2

私はdata.tableに3列あります。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) 

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で色は緑、色は赤、色はオレンジ色の1色です。

代わり c(trial.table$min,trial.table$max)我々は数字を使用する場合それは作品

- c(1,2)を...

どうもありがとう!

+0

だから私が正しく理解していれば、あなたはその行の最小値と最大値に基づいて、最初の行のスタイルを設定したい場合、次の行のためにあなたがその行から最小値と最大値を使用してスタイルにしたい、とそうです。 – Carl

+0

@Carl Is。列「値」は、対応する行の最小値および最大値に基づいてスタイルを変更します。ありがとう – DemetriusRPaula

答えて

2

解決策は、styleIntervalではなくrowCallbackを使用することです。

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

関連する問題