我需要用以下规则有条件地给‘Weight’列的背景上色:非负值是绿色的,负值是红色的,但如果没有正值,那么0也应该是红色.我try 了多种方法,但在我看来,条件formatStyle不起作用,至少在这种形式下是这样的:

ui <- fluidPage(
  DT::dataTableOutput("weight_df")
)

server <- function(input, output, session){
  
  df <- data.frame(weight = rep(1, 3))
  
  rv <- reactiveValues(weight_df = df)
  
  output$weight_df <- renderDataTable({
    
    DT::datatable(
      data = df,
      caption  = htmltools::tags$caption("Weight table"),
      editable = list(target = "column"),
    ) %>%
      formatStyle(
        "weight", 
        fontWeight = "bold",
        backgroundColor = `if`(
          all(df[["weight"]] <= 0),
          "orangered",
          styleInterval(-10^(-32), c("orangered", "limegreen"))
        )
      ) 
  })
  table_proxy <- DT::dataTableProxy("weight_df")
  
  observeEvent(input$weight_df_cell_edit, {
    
    info <- input$weight_df_cell_edit

    new_weights <- info[["value"]]
    is_numeric <- checkmate::testNumeric(
      x = new_weights,
      finite = TRUE,
      any.missing = FALSE
    )
    
    if(is_numeric)
      rv$weight_df[["weight"]][info[["row"]]] <- info[["value"]]
    
    DT::replaceData(table_proxy, rv$weight_df)
  })
}

shinyApp(ui, server)

注:无需再次渲染表格.如果所有权重都为0,我可以使其再次渲染.

推荐答案

我认为这是不可能的formatStyle.这里有一个部分解决方案.它是部分的,因为它不处理0的情况,当没有值为正值时,0必须为红色.我会考虑的

library(shiny)
library(DT)

ui <- fluidPage(
  br(),
  DTOutput("weight_df")
)

server <- function(input, output, session){
  
  df <- data.frame(weight = c(-1, 0, 2))
  
  rdf <- reactiveVal(df)
  
  output$weight_df <- renderDT({
    
    datatable(
      data = df,
      rownames = TRUE,
      caption  = htmltools::tags$caption("Weight table"),
      editable = list(target = "cell"),
      options = list(
        rowCallback = JS(js)
      )
    ) 
  })
  
  table_proxy <- dataTableProxy("weight_df")
  
  observeEvent(input$weight_df_cell_edit, {
    info <- input$weight_df_cell_edit
    dat <- rdf()
    rdf(editData(dat, info, table_proxy, rownames = TRUE))
  })
}

shinyApp(ui, server)

Update

它处理0的特定情况:

library(shiny)
library(DT)

js <- c(
  "function(row, dat, displayNum, index){",
  "  var color = dat[1] >= 0 ? 'green' : 'red';",
  "  $('td:eq(1)', row).css('background-color', color);",
  "}"
)

js <-  c(
  "function(settings) {",
  "  var table = settings.oInstance.api();",
  "  var nrows = table.rows().count();",
  "  var allnegative = true;",
  "  var i = 0;",
  "  while(allnegative && i < nrows) {",
  "    var weight = table.cell(i, 1).data();",
  "    allnegative = allnegative && weight <= 0;",
  "    i++;",
  "  }",
  "  for(var k = 0; k < nrows; k++) {",
  "    var cell = table.cell(k, 1);",
  "    var weight = cell.data();",
  "    var color = allnegative ? 'red' : 'green';",
  "    if(weight > 0) {",
  "      color = 'green';",
  "    } else if(weight < 0) {",
  "      color = 'red';",
  "    }",
  "    cell.node().style.backgroundColor = color;",
  "  }",
  "}")

ui <- fluidPage(
  br(),
  DTOutput("weight_df")
)

server <- function(input, output, session){
  
  df <- data.frame(weight = c(-1, 0, 2))
  
  rdf <- reactiveVal(df)
  
  output$weight_df <- renderDT({
    
    datatable(
      data = df,
      rownames = TRUE,
      caption  = htmltools::tags$caption("Weight table"),
      editable = list(target = "cell"),
      options = list(
        drawCallback = JS(js)
      )
    ) 
  })
  
  table_proxy <- dataTableProxy("weight_df")
  
  observeEvent(input$weight_df_cell_edit, {
    info <- input$weight_df_cell_edit
    dat <- rdf()
    rdf(editData(dat, info, table_proxy, rownames = TRUE))
  })
}

shinyApp(ui, server)

R相关问答推荐

使用R的序列覆盖

从开始时间和结束时间导出时间

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

是否可以创建一个ggplot与整洁判断的交互作用

如何在所有绘图中保持条件值的 colored颜色 相同?

计算满足R中条件的连续列

如何通过ggplot2添加短轴和删除长轴?

2个Rscript.exe可执行文件有什么区别?

展开对数比例绘图的轴(添加填充)

从多个可选列中选取一个值到一个新列中

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

如何计算每12行的平均数?

按镜像列值自定义行顺序

是否从列中删除★符号?

在不重复主题的情况下重新排列组

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

在R中添加要打印的垂直线

R,将组ID分配给另一个观测ID变量中的值的组合

如何在R曲线图弹出窗口中更改r和theta标签

移除y轴断开的geom_bar图的外框