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
你的代码还存在几个会导致后续运行报错的问题,建议同步修改:
- 顶部的随机测试数据生成代码用了
FINISH变量,但FINISH是在server内部才定义的,需要把这部分随机数生成代码挪到server中FINISH <-17522的行之后,替换你现在的solarData <- soldata等赋值语句。 model函数中dP_dt <- fChargingPumHydro -这行语法错误,后面缺少了放电项,补全为dP_dt <- fChargingPumHydro - fDischargingPumHy。currentExcessPower函数中变量名拼写错误:aPumpHydroCharging应该改为aPumHydroCharging。- 绘制
ressource_plot时用到的sCapital、sResource变量没有在你的stocks列表中定义,要么补充对应的状态量计算逻辑,要么暂时注释掉这个绘图避免报错。
内容的提问来源于stack exchange,提问作者GieGie
相关产品推荐
相关产品推荐

