You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Shiny表格实现最接近值标绿及各组最接近次数统计需求

实现方案

要完成你要求的两项功能,需要改用DT包实现表格的自定义样式渲染,完整可运行代码如下:

library(shiny)
library(DT)

ui <- fluidPage(
    titlePanel("随机模拟对比测试"),
    sidebarLayout(
        sidebarPanel(
            actionButton("random_select",
                         "生成随机数",
                         width = 'auto')
        ),
        mainPanel(
           DTOutput("results_table_output")
        )
    )
)

server <- function(input, output) {
    counter <- reactiveValues(countervalue = 0)
    
    observeEvent(input$random_select,{
        counter$countervalue = counter$countervalue + 1
    })
    
    results <- reactiveValues(
        table = list(trial = NA,
                     answer =NA,
                     test_1 = NA,
                     test_2 = NA,
                     test_3 = NA)
    )
    
    observeEvent(counter$countervalue,{
        results$table$trial[counter$countervalue] <- as.integer(counter$countervalue)
        results$table$answer[counter$countervalue] <- sample(1:10,1)
        results$table$test_1[counter$countervalue] <- sample(1:10,1)
        results$table$test_2[counter$countervalue] <- sample(1:10,1)
        results$table$test_3[counter$countervalue] <- sample(1:10,1)
    })
    
    output$results_table_output <- renderDT({
        # 转换为数据框并过滤初始化空行
        df <- na.omit(as.data.frame(results$table))
        if(nrow(df) == 0) {
            return(datatable(df, rownames = FALSE, options = list(dom = 't', ordering = FALSE)))
        }
        
        # 逐行定位最接近答案的测试组
        best_col_per_row <- apply(df, 1, function(row_data) {
            test_vals <- as.numeric(row_data[c("test_1", "test_2", "test_3")])
            answer_val <- as.numeric(row_data["answer"])
            diff_vals <- abs(test_vals - answer_val)
            return(names(diff_vals)[which.min(diff_vals)])
        })
        
        # 统计各测试组累计最优次数
        count_test1 <- sum(best_col_per_row == "test_1")
        count_test2 <- sum(best_col_per_row == "test_2")
        count_test3 <- sum(best_col_per_row == "test_3")
        
        # 追加汇总行
        df <- rbind(df, data.frame(
            trial = "累计次数",
            answer = NA,
            test_1 = count_test1,
            test_2 = count_test2,
            test_3 = count_test3
        ))
        
        # 渲染表格并添加单元格样式
        dt <- datatable(df, rownames = FALSE, options = list(dom = 't', ordering = FALSE))
        # 为每行最优单元格设置绿色背景
        for (row_idx in seq_along(best_col_per_row)) {
            col_idx <- which(colnames(df) == best_col_per_row[row_idx])
            dt <- formatStyle(
                dt,
                columns = col_idx,
                target = 'cell',
                rows = row_idx,
                backgroundColor = "lightgreen"
            )
        }
        return(dt)
    })
}

shinyApp(ui = ui, server = server)

核心修改说明

  • 替换原生表格渲染组件:将原有的tableOutput+renderTable替换为DT包的DTOutput+renderDT,支持自定义单元格样式
  • 最优值定位逻辑:逐行计算三个测试组数值与正确答案的绝对差值,通过which.min定位差值最小的列,适配无平局的业务场景
  • 汇总行实现:统计历史所有测试轮次中三个测试组分别成为最优值的总次数,在表格末尾追加一行展示统计结果
  • 样式配置:关闭了默认的排序、搜索控件,仅保留基础表格展示,同时将最优单元格背景设置为浅绿色,可根据需要调整颜色值

内容的提问来源于stack exchange,提问作者Jake L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:39:02