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

R语言嵌套调用函数时SControlModelStates对象不存在报错解决方法

问题原因
  • 核心问题是R的词法作用域规则和func_1的参数设计缺陷共同导致的:
    1. func_1的定义里没有把SControlModelStates列为入参,执行时会从它的**定义环境(也就是全局环境)**查找该变量,而不是从调用它的父函数环境查找
    2. 直接在全局运行循环时,全局环境已经定义了SControlModelStates,所以func_1可以正常读取
    3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:48:03