我正在尝试使用get
在一系列函数调用中,但对象名称的查找似乎跳过了环境。例如:
foo <- 1 # variable in .GlobalEnv
getter <- function(x) {get(x)}
getter("foo") # returns 1, which is expected
f1 <- function() {
foo <- 2 # local variable in the function scope
getter("foo")
}
f1() # still returns 1, would've expected to return 2
为何如此呼唤f1
返回foo
在全球环境中,而不是在foo
在调用函数的环境中?
我怎么有get
查看调用函数的环境?环境pos = sys.parent()
似乎不起作用。
你会被框架和环境之间的微妙差异所困扰(这甚至更加微妙,因为框架就是环境,或者环境就是框架)以及两者之间的差异词法和动态作用域 https://stackoverflow.com/questions/3840769/scoping-and-functions-in-r-2-11-1-whats-going-wrong。帮助页面中有一些详细信息parent.frame http://www.inside-r.org/r-doc/base/parent.frame以及其他遍布各种文档的地方。
尝试简化:
Your getter
函数有自己的环境 http://www.inside-r.org/r-doc/base/environment存储该函数局部变量的位置(x
在这种情况下)。由于 R 是词法作用域,这意味着函数环境有一个父环境,该父环境由定义函数的位置定义,在这种情况下是全局环境(如果它是在另一个函数内部定义的,那么父环境将是该函数的 env)功能)。
你打电话时f1
它调用getter
然后 getter 尝试查找变量foo
,它首先在自己的环境中查找,没有找到它,然后在其父环境(即全局环境)中查找并找到foo
值为 1。
您的思维遵循动态范围界定,框架近似于此。什么时候f1
被称为它有自己的环境(在其中foo
将被分配值2),然后它调用getter
功能。的环境foo
不是 的父级getter
的 env (词法作用域),但是环境f1
是的父框架getter
since getter
被叫自f1
,所以看看环境f1
你需要告诉get
函数查看父框架而不是父环境。
总而言之,父环境是定义函数的环境(词法作用域),父框架是调用函数的框架/环境(模拟动态作用域)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)