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

R Shiny结合deSolve实现动态能源模型时辅助函数变量未找到报错求解

错误原因

你遇到的报错本质是R函数作用域规则导致的:
R函数默认从自身定义的环境、而非调用时的环境查找未在参数中声明的变量。你虽然把aCLithium放在了auxs列表里,且在model函数中用with(as.list(c(stocks,auxs)))暴露了所有辅助变量,但currentLithiumChargePower是定义在observe作用域下的,无法直接继承model中with块的变量,也没有在参数中接收aCLithium,因此运行时找不到该对象。

解决方案

方案1(最简修复):给辅助函数补全参数

将aCLithium添加到currentLithiumChargePower的参数列表中,调用时传入即可:

# 修改函数定义,增加aCLithium参数
currentLithiumChargePower <- function(sLithium, aCharge, aLithiumCap, aEfficiencyLithium, aCLithium) {
  availableCap <- (aLithiumCap-sLithium)
  potCharge    <- (aCharge/aEfficiencyLithium)
  chargePower  <- (aCLithium*aLithiumCap)/aEfficiencyLithium
  # 剩余原有逻辑不变
}

# 在model中调用时,补传aCLithium参数
aLithiumCharging <- currentLithiumChargePower(sLithium,aCharge, aLithiumCap,aEfficiencyLithium, aCLithium)

同理你后面定义的curLithiumDischarge函数也用到了aCLithium,也需要同步补全参数。

方案2(更易维护):把所有辅助函数挪到model内部定义

所有和模型计算相关的辅助函数都放到model函数的with块之前定义,就可以直接使用with暴露的所有变量,不需要重复传参:

model <- function(time,stocks,auxs){
  # 所有辅助函数移到这里定义
  chargeFunction <- function(supplydemandGap){
    if (supplydemandGap>=0){
      return(supplydemandGap)
    }
  }
  # 其他dischargeFunction、currentLithiumChargePower等辅助函数都挪到这里
  # 不用额外加参数,直接用aCLithium等变量即可
  
  with(as.list(c(stocks,auxs)),{
    # 原有model内部的计算逻辑不变
  })
}

其他需要修复的bug

你的代码还存在几个会导致后续运行报错的问题,建议同步修改:

  1. 顶部的随机测试数据生成代码用了FINISH变量,但FINISH是在server内部才定义的,需要把这部分随机数生成代码挪到server中FINISH <-17522的行之后,替换你现在的solarData <- soldata等赋值语句。
  2. model函数中dP_dt <- fChargingPumHydro - 这行语法错误,后面缺少了放电项,补全为dP_dt <- fChargingPumHydro - fDischargingPumHy。
  3. currentExcessPower函数中变量名拼写错误:aPumpHydroCharging应该改为aPumHydroCharging。
  4. 绘制ressource_plot时用到的sCapital、sResource变量没有在你的stocks列表中定义,要么补充对应的状态量计算逻辑,要么暂时注释掉这个绘图避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:45:03