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

R语言调试eval错误:代码报‘Sh未找到’,求调试函数及解决方案

调试eval错误的R工具及代码修复方案

一、调试eval错误的常用R函数

  • traceback():打印错误调用栈,定位错误发生的具体位置
  • browser():在代码指定位置插入该函数,运行到此处将进入交互式调试环境,可实时查看变量值
  • debug():为目标函数开启调试模式,支持逐行执行代码并检查状态
  • options(error = recover):设置错误触发时进入恢复模式,可查看各调用帧的变量情况

二、你的代码错误分析与修复

错误提示object 'Sh' not found,核心问题是计算Nh、Nr等变量时,错误地仅在pars列表中查找Sh、Eh等状态变量,但这些变量属于初始状态集合y,并不在参数集合pars内。同时,lamh、lamr依赖每个时间点的实时状态值,而非初始值,原本的外部计算逻辑不符合微分方程求解要求。

修复后的完整代码:

Lassa <- function (pars, Sh_0 = 10000, Eh_0 = 0, Iha_0 = 324, Ihs_0 = 81, Rh_0 = 10, Sr_0 = 1000, Er_0 = 0, Ir_0 = 100, Vs_0 = 1000, Va_0 = 100) {
  
  derivs <- function(time, y, pars) {
    with (as.list(c(pars, y)), {
      # 依赖实时状态的变量需在derivs内部计算
      Nh <- Sh + Eh + Iha + Ihs + Rh
      Nr <- Sr + Er + Ir
      Kv <- max(Vs, Va)
      lamh <- (beth * Ir)/Nr + (beth * et1 * Ihs)/Nh + (beth * et2 * Iha)/Nh + (beth * et3 * Vs)/Kv + (beth * et4 * Va)/Kv
      lamr <- (betr * Ir)/Nr + (betr * x1 * Vs)/Kv
      
      dSh <- p1 - lamh * Sh - m1 * Sh
      dEh <- lamh * Sh - (ps1 + m1) * Eh
      dIha <- n * ps1 * Eh - (zet1 + m1) * Iha
      dIhs <- (1-n) * ps1 * Eh - (delt + zet2 + m1) * Ihs
      dRh <- zet1 * Iha + zet2 * Ihs - m1 * Rh
      dSr <- p2 - lamr * Sr - (rh + m2) * Sr
      dEr <- lamr * Sr - (ps2 + rh + m2) * Er
      dIr <- ps2 * Er - (rh + m2) * Ir
      dVs <- ph1 * Iha + ph2 * Ihs + ph3 * Ir - (thet2 + thet3) * Vs
      dVa <- thet3 * Vs - thet2 * Va
      
      return(list(c(dSh, dEh, dIha, dIhs, dRh, dSr, dEr, dIr, dVs, dVa), logSh = log(Sh)))
    })
  }
  
  # 定义初始状态
  y <- c(Sh = Sh_0, Eh = Eh_0, Iha = Iha_0, Ihs = Ihs_0, Rh = Rh_0, Sr = Sr_0, Er = Er_0, Ir = Ir_0, Vs = Vs_0, Va = Va_0)
  
  times <- c(seq(0, 0.8, 0.1), seq(2, 60, 2))
  out <- ode(y = y, parms = pars, times = times, func = derivs)
  
  as.data.frame(out)
}

pars <- c(p1 = 0.497, p2 = 2.74, m1 = 0.0000497, m2 = 0.00274, ps1 = 0.0094, ps2 = 0.048, beth = 0.00017, betr = 0.004, rh = 0.0006, n = 0.8, zet1 = 0.0000476, zet2 = 0.0000323, delt = 0.0005, thet2 = 0.01868, thet3 = 0.00701, ph1 = 0.0667, ph2 = 0.0357, ph3 = 0.002569, x1 = 0.167, et1 = 0.94, et2 = 0.95, et3 = 0.9, et4 = 0.85)

out <- Lassa(pars = pars)

关键修复说明:

  1. 状态依赖变量移至derivs内部:Nh、Nr、lamh等变量需要根据每个时间点的实时状态值计算,放在derivs内部才能保证求解过程中动态更新。
  2. 修正变量查找范围:通过as.list(c(pars, y))将参数和状态变量合并到同一环境,避免因变量归属错误导致的查找失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:02:10