我正在学习返回其他功能的函数。例如:
foo1 <- function()
{
bar1 <- function()
{
return(constant)
}
}
foo2 <- function()
{
constant <- 1
bar2 <- function()
{
return(constant)
}
}
现在假设我宣布函数f1
和f2
如下:
constant <- 2
f1 <- foo1()
f2 <- foo2()
然后看起来它们具有相同的功能定义:
> f1
function()
{
return(constant)
}
<environment: 0x408f048>
> f2
function()
{
return(constant)
}
<environment: 0x4046d78>
>
但两个功能不同。例如:
> constant <- 2
> f1()
[1] 2
> f2()
[1] 1
我的问题:为什么两个具有相同功能定义的函数产生不同的结果是合法的?
我理解foo1
将常量视为全局变量而foo2
视为常量变量,但是不可能从函数定义中确定这一点吗?
(我可能遗漏了一些基本的东西。)
答案 0 :(得分:7)
当然他们与众不同,环境不同。尝试ls(environment(f1))
然后ls(environment(f2))
然后get('constant', environment (f1))
和f2
答案 1 :(得分:2)
列夫的回答是正确的。更详细地描述。当你调用f1或传递f1时,你也可以引用定义函数的原始词法环境。
#since R is interpreted.. the variable constant doesn't have to be defined in the lexical environment... this all gets checked and evaluated at runtime
foo1ReturnedThisFunction <- foo1()
#outputs "Error in foo1ReturnedThisFunction() : object 'constant' not found"
foo1ReturnedThisFunction()
#defined the variable constant in the lexical environment
constant <- 5
#outputs 5
foo1ReturnedThisFunction()
在foo2 ...中有一个变量常量的定义在&#34; close&#34; (不确定这是否是正确的术语)词汇环境所以它使用它并且不会在&#34;全局&#34;中查找变量常量。环境