R函数返回函数...和变量范围

时间:2014-12-20 14:26:57

标签: r

我正在学习返回其他功能的函数。例如:

foo1 <- function()
{
  bar1 <- function()
  {
    return(constant)
  }
}

foo2 <- function()
{
  constant <- 1
  bar2 <- function()
  {
    return(constant)
  }
}

现在假设我宣布函数f1f2如下:

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视为常量变量,但是不可能从函数定义中确定这一点吗?

(我可能遗漏了一些基本的东西。)

2 个答案:

答案 0 :(得分:7)

当然他们与众不同,环境不同。尝试ls(environment(f1))然后ls(environment(f2))然后get('constant', environment (f1))f2

相同

答案 1 :(得分:2)

Scope in R

列夫的回答是正确的。更详细地描述。当你调用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;中查找变量常量。环境