2016-06-27 18 views
5

Tek bir kimlik sütunu ve birden çok sayısal sütuna sahip bir data.frame'im var, sayısal sütunların miktarı farklılık gösterebilir. Bu sayısal sütunlardan sütun yeşilin üstündeki tüm değerleri renklendirmek istiyorum ve sütunun altındaki tüm değerler kırmızıdır. Aşağıdaki kod istediğim sonucu verir, ancak az çok sayısal sütun içeren veri çerçeveleri için genel bir kod değildir.formatı Birden çok sütun üzerinde kopyalama DT R

library(DT) 

data2 <- cbind(ID = "some ID",iris[,1:4]) 

    datatable(
     data2, rownames = FALSE, class = 'cell-border stripe', 
     options = list(
     dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) 
    ) 
) %>% 
    formatStyle(colnames(data)[2], backgroundColor = styleInterval(mean(data[,2]), c("red","green"))) %>% 
    formatStyle(colnames(data)[3], backgroundColor = styleInterval(mean(data[,3]), c("red","green"))) %>% 
    formatStyle(colnames(data)[4], backgroundColor = styleInterval(mean(data[,4]), c("red","green"))) %>% 
    formatStyle(colnames(data)[5], backgroundColor = styleInterval(mean(data[,5]), c("red","green"))) 

Yukarıdaki kodu yukarıdaki kodla değiştirmek istiyorum ancak çalışmaz. Aşağıdaki kod, sayısal sütunların sayısı değiştiğinde de çalışır.

datatable(
    data2, rownames = FALSE, class = 'cell-border stripe', 
    options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) 
) 
) %>% 
    formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleInterval(colMeans(data2[,2:ncol(data2)]), c("red","green"))) 

Bu mümkün mü? Yani evet nasıl?

cevap

3

Sen üretebilir

hepl_1=sapply(2:ncol(data2),function(i) ifelse(data2[[i]]>=mean(data2[[i]]),"rgb(255,0,0)","rgb(0,255,0)")) 
help_3=as.matrix(data2[2:ncol(data2)]) 

datatable(
    data2, rownames = FALSE, class = 'cell-border stripe', 
    options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) 
) 
) %>% 
    formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleEqual(help_3, hepl_1)) 

Güncelleme

(Not farklı sütunda aynı değere sahip çalışmak) gibi ilave hesaplama ile bunu yapabilir rowCallback

datatable(
    data2, rownames = FALSE, class = 'cell-border stripe', 
    options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')), 
    rowCallback=JS(paste0("function(row, data) {\n", 
          paste(sapply(2:ncol(data2),function(i) paste0("var value=data[",i-1,"]; if (value!==null) $(this.api().cell(row,",i-1,").node()).css({'background-color':value <=", mean(data2[[i]])," ? 'red' : 'green'});\n") 
         ),collapse = "\n"),"}")) 
) 
) 
gibi
+0

Mindere sahip olma fikri sayıları ve karşılık gelen renklerle bir matris ile rix, bir sütun kırmızı ve diğer yeşil olduğunda farklı sütunlarda aynı değere sahipseniz, çalışmaz. Daha sonra – Berecht

+0

Ah ilk sütunun rengini verecektir. Evet haklısınız ... düşünmeye gideceksiniz – Batanichek

+0

Renkleri belirledikten sonra titremeye veya rasgele hale getirebilirsiniz. Sadece oluşturulan rasgele sayının benzersiz olduğundan emin olmanız gerekir. – Berecht

İlgili konular