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

在crmPack中定义单参数幂模型调用update函数报错求助

修复"no slot of name 'call'"错误的解决方案

这个错误出现的根源是crmPack的Model基类要求所有模型对象必须包含call槽,用来记录创建模型时的调用上下文,而你自定义的OneParExp类在构造时没有初始化这个槽,导致update函数无法找到它。

下面是具体的修复步骤和修改后的代码:

1. 核心修复点:添加call槽初始化

在OneParExp构造函数中,调用.OneParExp创建对象时,需要加入call = match.call()参数——match.call()会自动捕获当前函数的调用语句,正好填充Model类要求的call槽。

2. 修改后的完整可运行代码

# package and options
library(crmPack)
options <- McmcOptions(burnin = 1000, step = 2, samples = 5000)
set.seed(1)

# extra functions to define the power model
.OneParExp <- setClass(Class = "OneParExp", contains = "Model", 
                       representation(skeletonFun = "function", skeletonProbs = "numeric", lambda = "numeric"))

OneParExp <- function(skeletonProbs, doseGrid, lambda) {
  skeletonFun <- approxfun(x = doseGrid, y = skeletonProbs, rule = 2)
  invSkeletonFun <- approxfun(x = skeletonProbs, y = doseGrid, rule = 1)
  .OneParExp(
    call = match.call(),  # 新增:初始化call槽,满足Model基类要求
    skeletonFun = skeletonFun,
    skeletonProbs = skeletonProbs,
    lambda = lambda,
    datamodel = function(){
      for (i in 1:nObs) {
        y[i] ~ dbern(p[i])
        p[i] <- skeletonProbs[xLevel[i]]^theta
      }},
    datanames = c("nObs", "y", "xLevel"),
    prob = function(dose, theta){ skeletonFun(dose)^theta },
    dose = function(prob, theta){ invSkeletonFun(prob^(1 / theta)) },
    priormodel = function(){ theta ~ dexp(lambda) },
    modelspecs = function(){ list(skeletonProbs = skeletonProbs, lambda = lambda) },
    init = function(){ list(theta = 1) },
    sample = "theta")
}

# tox data and model fitting
data <- Data(x = c(1.2,1.2,1.8,2.4,3), y = c(0, 0, 0, 1, 1), cohort = c(1, 1, 2, 3, 4), doseGrid = seq(1.2, 3, 0.6), ID = 1:5, placebo = FALSE)
(skeletonProbs <- round(data@doseGrid / max(data@doseGrid) / 4, 2))
newModel <- OneParExp(skeletonProbs = skeletonProbs, doseGrid = data@doseGrid, lambda = 1)
newDLTmodel <- update(object=newModel, data=data)

3. 修复效果验证

运行修改后的代码,update函数会正常执行,不再抛出"no slot of name 'call'"的错误。这是因为我们手动为模型对象补充了call槽,满足了Model基类的结构要求,update函数可以正确识别并处理这个自定义模型对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:06:10