2014-04-06 57 views
2

这是一个相对简单的问题,但我很难过。我在编程R,但我不认为这个问题仅限于R.下面我试着写一些简单的代码演示问题:带有来自其他功能输入的额外参数的功能

f1 = function(x) { 
    return(a + x) 
} 

f2 = function(ftn) { 
    return(ftn(1)) 
} 

f3 = function(a) { 
    return(f2(f1)) 
} 

的问题:如果我叫F3(2) [例如],返回f2(f1),并且f2(f1)返回f1(a + 1)。但是f1不能识别我在f3中放置的'a'的值,所以代码不起作用!有什么办法可以让f1识别输入到f3吗?

回答

3

R使用词法作用域,而不是动态作用域。函数在定义函数的环境中查找自由变量(使用但未在其中定义的变量)。在全球环境中定义了f1,因此在全球环境中查找a,并且在那里没有a。我们可以强制f1查找在f3这样的运行实例的自由变量:

f3 = function(a) { 
    environment(f1) <- environment() 
    return(f2(f1)) 
} 

这将暂时与所需的环境创建一个新的f1f3

如果f1只需要内f3另一种可能性是定义f1那里(而不是在全球环境中):

f3 = function(a) { 
    f1 = function(x) { 
     return(a + x) 
    }  
    return(f2(f1)) 
} 

顺便说一句,在运行函数中最后计算表达式返回所以这可写为:

f3 <- function(a) { 
     f1 <- function(x) a + x 
     f2(f1) 
}