2016-06-27 17 views
5

Tôi có một data.frame với một cột ID và nhiều cột số, số lượng cột số có thể khác nhau. Trong số các cột số tôi muốn tô màu tất cả các giá trị trên cột có nghĩa là màu xanh lá cây và tất cả các giá trị bên dưới cột có nghĩa là màu đỏ. Đoạn mã dưới đây đưa ra kết quả mong muốn của tôi, nhưng nó không phải là một mã chung cho các khung dữ liệu có nhiều cột số hoặc ít hơn.formatStyle qua nhiều cột 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"))) 

Tôi muốn thay thế mã ở trên bằng mã bên dưới nhưng điều đó không hiệu quả. Mã bên dưới cũng sẽ hoạt động khi số lượng cột số thay đổi.

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

Điều này có thể không? Vì vậy, có, làm thế nào?

Trả lời

3

Bạn có thể làm điều đó với tính toán bổ sung như

(Không làm việc với cùng một giá trị trong cột khác nhau)

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

Cập nhật

Bạn có thể tạo rowCallback như

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"),"}")) 
) 
) 
+0

Ý tưởng có một tấm thảm rix với các số và ma trận với các màu tương ứng, không hoạt động nếu bạn có cùng giá trị trong các cột khác nhau khi nó ở trong một cột màu đỏ và màu xanh lá cây khác. Sau đó nó sẽ cho màu của cột đầu tiên – Berecht

+0

Ah .. vâng bạn đúng ... nghĩ về nó – Batanichek

+0

Bạn có thể jitter hoặc ngẫu nhiên nó sau khi xác định màu sắc. Chỉ bạn mới cần đảm bảo rằng số ngẫu nhiên được tạo là duy nhất – Berecht

Các vấn đề liên quan