提问者:小点点

R基于值的闪亮DT格式化列


我试图根据另一列格式化多列的输出。

在下面的示例中,我希望根据Col1/2/3/4的值与“Argu”列中的值进行比较来格式化它们。

即< br> -如果Col1,Row1小于7,则标记为红色,否则标记为绿色。< br> -如果Col1,Row2小于6,则标记为红色,否则标记为绿色。< br> -如果Col1,Row3小于7,则标记为红色,否则标记为绿色。< br> -如果Col2,Row1小于7,则标记为红色,否则标记为绿色。< br> -如果Col2,Row2小于6,则标记为红色,否则标记为绿色。< br> -如果Col2,Row3小于7,则标记为红色,否则标记为绿色。

等等。

我知道通过显式调用该值来基于另一列格式化一列很简单,但对于行之间的可更改参数值,这不起作用

# Load Packages
library(shiny)
library(DT)

# Create DT
Col1 = c(9,5,8)
Col2 = c(9,4,7)
Col3 = c(9,9,5)
Col4 = c(8,8,7)
Argu = c(7,6,7)
df = data.frame(Col1,Col2,Col3,Col4,Argu)

# Create Shiny Output
shinyApp(
  ui = 
      navbarPage("Testing",dataTableOutput('dt')),

  server = function(input, output, session) {

    output$dt = DT::renderDataTable(datatable(df)
    %>% formatStyle("Col1","Argu", backgroundColor = styleInterval(6.1,
c("Red","Green")))

  )}
 )

任何帮助都将不胜感激!


共2个答案

匿名用户

您可以构建隐藏的逻辑列,以将每个数据列与 Argu 进行比较,并相应地格式化 DT 上的列。

请参考下面的代码。希望这有帮助。

# Load Packages
library(shiny)
library(DT)

# Create DT
Col1 = c(9,5,8)
Col2 = c(9,4,7)
Col3 = c(9,9,5)
Col4 = c(8,8,7)
Argu = c(7,6,7)
df = data.frame(Col1,Col2,Col3,Col4,Argu)

# Build hidden logical columns for conditional formatting
dataCol_df <- ncol(df) - 1
dataColRng <- 1:dataCol_df
argColRng <- (dataCol_df + 2):(dataCol_df * 2 + 1)
df[, argColRng] <- df[, dataColRng] < Argu

# Create Shiny Output
shinyApp(
  ui = 
    navbarPage("Testing",dataTableOutput('dt')),
  server = function(input, output, session) {
    output$dt = DT::renderDataTable(
      datatable(df,
                # Hide logical columns
                options=list(columnDefs = list(list(visible=FALSE, 
                                                    targets=argColRng)))) %>% 
        # Format data columns based on the values of hidden logical columns
        formatStyle(columns = dataColRng,
                    valueColumns = argColRng,
                    backgroundColor = styleEqual(c('0', '1'), 
                                                 c("green", "red")))
    )}
)

匿名用户

这里有另一个解决方案:

library(shiny)
library(DT)

# Create DT
Col1 = c(9,5,8)
Col2 = c(9,4,7)
Col3 = c(9,9,5)
Col4 = c(8,8,7)
Argu = c(7,6,7)
df = data.frame(Col1,Col2,Col3,Col4,Argu)

# Create Shiny Output
shinyApp(
  ui = 
    navbarPage("Testing",dataTableOutput('dt')),

  server = function(input, output, session) {

   output$dt <- renderDataTable( DT::datatable(df,options = list(rowCallback = JS('
                                                          function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
                                                     if (parseFloat(aData[1]) < aData[5])
                                                     $("td:eq(1)", nRow).css("background-color", "red");
                                                     if (parseFloat(aData[1]) >= aData[5])
                                                     $("td:eq(1)", nRow).css("background-color", "green");
                                                     if (parseFloat(aData[2]) < aData[5])
                                                     $("td:eq(2)", nRow).css("background-color", "red");
                                                     if (parseFloat(aData[2]) >= aData[5])
                                                     $("td:eq(2)", nRow).css("background-color", "green");
                                                     if (parseFloat(aData[3]) < aData[5])
                                                     $("td:eq(3)", nRow).css("background-color", "red");
                                                     if (parseFloat(aData[3]) >= aData[5])
                                                     $("td:eq(3)", nRow).css("background-color", "green");
                                                     if (parseFloat(aData[4]) < aData[5])
                                                     $("td:eq(4)", nRow).css("background-color", "red");
                                                     if (parseFloat(aData[4]) >= aData[5])
                                                     $("td:eq(4)", nRow).css("background-color", "green");
                                                                                  }'
                                                                                  ))))


    }
)