2017-02-06 68 views
6

varsayalım aşağıdaki fonksiyonlara sahiptir: ŞimdiBağlama dış değişkenler

h = 4 
g(2) 

## should be 6 

: Ben h adında bir nesne, herhangi bir sorun olmazdı benim ortamında varsa Asistan

g = function(x) x+h 

ben başka fonksiyonlara sahiptir:

f = function() { 
    h = 3 
    g(2) 
} 

ben beklenebilir:

rm(h) 
f() 

## should be 5, isn't it? 

Bunun yerine, ben f yılında h g h bağlanabilir böylece olduğu gibi g, f ait ortamında değerlendirilecektir beklenir

## Error in g(2) : object 'h' not found 

bir hatayı olsun .GlobalEnv içinde g çalıştırdığımda. Bu gerçekleşmez (belli ki). herhangi bir açıklama neden? Bunun üstesinden nasıl gelinir ki fonksiyon içindeki fonksiyon (ör. g) çevreleyen ortam kullanılarak değerlendirilecek? Orada bir fonksiyonun parça çevre arasındaki fark, ve bunun (ana) değerlendirme çerçeve

+0

, ancak R tüm değişkenler için küresel kapsama görünüyor olsa ya tanımlanmamış olarak görünüyor işlev çağrısı veya parametre olarak geçirilir. –

cevap

7

.

İşlev tanımlandığında çevreleyen ortam ayarlanır. Eğer R isteminde fonksiyonu g tanımlarsanız:

g = function(x) x+h 

sonra g kapatılmasının ortamı küresel ortam olacak. Şimdi başka bir işlevinden g ararsanız:

f = function() { 
    h = 3 
    g(2) 
} 

ebeveyn değerlendirme çerçevesi f 'ın ortamıdır. Ancak bu, değerlendirildiği yere bağlı olmayan sabit bir özellik olan g'un çevreleyen ortamını değiştirmez. Bu nedenle, f içinde tanımlanmış olan h değerini almaz. Şimdi g s ortamı 'çevreyi kaplayan ler f olacak'

f = function() { 
    h = 3 
    g = function(x) x+h 
    g(2) 
} 

(ama dikkat edin: Eğer f içinde tanımlanmış h değerini kullanmak g istiyorsanız

, o zaman da gf içinde tanımlamalıdır Bu g, R isteminde daha önce oluşturduğunuz g ile aynı değildir).

Alternatif aşağıdaki gibi g ait kapatan ortamını değiştirebilirsiniz: bir yanıt yok

f = function() { 
    h = 3 
    environment(g) <- environment() 
    g(2) 
}