2014-04-06 101 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) 
}