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

R Shiny对接随机化脚本报错:cat无法处理closure类型参数

问题分析与修复

错误原因

  1. 函数逻辑错误:my_function里错误用reactive()包装randomize调用,且未使用传入的函数参数,反而直接引用input$对象,导致返回的是reactive闭包(不是实际随机化结果),renderText无法处理闭包类型,触发cat错误。
  2. 参数赋值语法错误:ClinicalExperiment中treatment.names <- c(...)是赋值操作,并非参数传递,应改为treatment.names = c(...)。
  3. 随机化参数顺序问题:randomize参数需匹配实验定义的因子顺序(先招募中心,后病情严重程度),原代码调用顺序有误。

修复后的代码

library(shiny)
library(SRS)

Severity <- c("II", "III")
Centre <- c("A", "B", "C","D", "E", "F","G","H","I")

# 修正treatment.names的参数传递语法
expt <- ClinicalExperiment(number.of.factors = 2,
                           factor.names = c("Centre", "Severity"),
                           number.of.factor.levels = c(9, 2),
                           factor.level.names = list(Centre, Severity),
                           number.of.treatments = 2,
                           treatment.names = c("Standard", "Treatment"))
r.obj <- new("PocockSimonRandomizer", expt, as.integer(12345))

# 重写函数:移除reactive包装,使用传入参数,匹配因子顺序
my_function <- function(num, centre, severity) {
  randomize(r.obj, num, c(centre, severity))
}

ui <- fluidPage(
  numericInput("num", "Study ID", value = 1, min = 1, max = 200),
  selectInput("Severity", "病情严重程度", Severity),
  selectInput("Centre", "招募中心", Centre),
  actionButton("click", "随机分组"),
  textOutput("text")
)

server <- function(input, output) {
  result <- eventReactive(input$click, {
    my_function(input$num, input$Centre, input$Severity)
  })
  
  output$text <- renderText({
    # 提取并格式化随机化结果
    paste("患者ID:", input$num, "| 分配组别:", result()$treatment)
  })
}

shinyApp(ui = ui, server = server)

关键修改说明

  • 修正参数传递:ClinicalExperiment中treatment.names改用=传递参数,避免语法错误。
  • 重构函数逻辑:移除reactive()包装,让my_function直接返回随机化结果;使用函数传入的参数而非直接引用input$,保证函数逻辑独立。
  • 匹配参数顺序:按实验定义的因子顺序(招募中心在前)传递参数,确保随机化逻辑准确。
  • 优化输出内容:提取randomize返回结果的treatment字段,输出清晰的分组信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:42:47