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)
关键修复说明:
- 状态依赖变量移至
derivs内部:Nh、Nr、lamh等变量需要根据每个时间点的实时状态值计算,放在derivs内部才能保证求解过程中动态更新。 - 修正变量查找范围:通过
as.list(c(pars, y))将参数和状态变量合并到同一环境,避免因变量归属错误导致的查找失败。
内容的提问来源于stack exchange,提问作者user21060315
相关产品推荐
相关产品推荐

