R嵌套source文件时函数内assign失效但直接调用正常,求解原因及优化方案
问题原因
- 核心原因是R采用词法作用域规则:变量查找优先匹配函数的定义环境,而非调用环境。你最初的
getObjectFromCalledProgram()是定义在Program1的全局环境中的,函数内用到的calledProgram变量会优先去全局环境查找,不会读取Program2运行时生成的calledProgram临时环境,自然拿不到嵌套source生成的对象。 - 原有写法的
parent.frame()默认仅取调用栈的上1层,没有搭配正确的变量查找逻辑,也会导致赋值目标环境指向错误。
你直接在Program2内写assign()语句时,calledProgram会在Program2的当前运行环境中查找,刚好匹配你刚生成的嵌套source临时环境,赋值的目标环境也默认是当前运行环境,所以可以正常运行。
修复方案
直接修改getObjectFromCalledProgram()的定义即可,不需要调整任何现有调用代码:
getObjectFromCalledProgram <- function(objectName) { # 从调用该函数的环境中提取calledProgram变量,适配词法作用域规则 calledProgram <- get(x = "calledProgram", envir = parent.frame()) # 直接赋值到调用该函数的环境中 assign( x = objectName, value = calledProgram[[objectName]], envir = parent.frame() ) }
修改后的函数会主动从调用方的运行环境中读取calledProgram临时环境,同时将目标对象赋值到调用方的运行环境,和直接手写assign的逻辑完全一致,适配任意层嵌套source的场景。
内容的提问来源于stack exchange,提问作者user3799203
相关产品推荐
相关产品推荐

