2015-09-17 76 views
0

我想創建一個函數,該函數使用已定義的變量,以便在更改此變量時,所創建函數的功能不會更改。通常,當您在環境中使用在該環境中定義的變量創建函數時,該函數將在該環境中調用該變量時查找該變量的值。例如:使用局部變量創建R函數使用其值

> x = 3 
> f = function() x + 3 
> f() 
[1] 6 
> x = 4 
> f() 
[1] 7 

我想創建f使得其僅僅是函數3 + 3,總是返回6.有沒有簡單的方法R中做到這一點?我知道我可以手動分配功能的相關部分,即

> body(f)[[2]] = x 
> f 
function() 
4 + 3 

這種策略是相當繁瑣的,雖然,因爲它需要你手動完成和更改所有出現。有更容易的方法嗎?

+2

定義'x'裏面的功能,以及。現在'f'必須超出本地範圍才能找到'x'。或者使用一個命名參數'f < - function(x = 3)x + 3' –

回答

3

複製值到本地變量:

f = local({ 
    x = x 
    function() x + 3 
}) 

f() 
# [1] 6 
x = 4 
f() 
# [1] 3 

現在f是它自己的環境中定義爲包含x的緩存值:

ls(environment(f)) 
# [1] "x" 
environment(f)$x 
# [1] 3 
+0

好的一個。我總是忘記'local()' –