R语言嵌套调用函数时SControlModelStates对象不存在报错解决方法
问题原因
- 核心问题是R的词法作用域规则和
func_1的参数设计缺陷共同导致的:func_1的定义里没有把SControlModelStates列为入参,执行时会从它的**定义环境(也就是全局环境)**查找该变量,而不是从调用它的父函数环境查找- 直接在全局运行循环时,全局环境已经定义了
SControlModelStates,所以func_1可以正常读取 - 在
func_2内部定义的SControlModelStates是func_2的局部变量,func_1的作用域链不会扫描func_2的内部环境,因此会报变量找不到的错误。
修复方案
第一步:修改func_1的定义,把SControlModelStates加入入参
library(pracma) func_1 <- function(VTimeStamp, iSample, SParameters, SControlModelStates){ # 新增该入参 # is this the first time step? if (pracma::isempty(SControlModelStates)){ stopifnot(iSample == 1) # set default values for any unspecified model parameters if (!('my_param' %in% names(SParameters))){ SParameters[['my_param']] <- 5 } SControlModelStates[['my_val']] <- rep(0, length(VTimeStamp)) } else { # this is not the first time step SControlModelStates[['my_val']][iSample] <- SControlModelStates[['my_val']][iSample-1] + SParameters[['my_param']] } res <- list('SParameters' = SParameters, 'SControlModelStates' = SControlModelStates) res }
第二步:修改func_2中调用func_1的传参逻辑,把当前的SControlModelStates传入
func_2 <- function(VTimeStamp){ SControlModelStates <- list() Parameters <- list() for (i in 1:length(VTimeStamp)){ # 调用时新增第四个参数,传入当前的SControlModelStates foo <- func_1 (VTimeStamp, i, Parameters, SControlModelStates) Parameters <- foo[["SParameters"]] SControlModelStates <- foo[["SControlModelStates"]] } return(SControlModelStates[["my_val"]]) }
测试运行
> func_2(1:5) [1] 0 5 10 15 20
内容的提问来源于stack exchange,提问作者umair durrani
相关产品推荐
相关产品推荐

