2017-02-06 2 views
6

Angenommen, ich habe die folgende Funktion:Bindung außerhalb Variablen in R

g = function(x) x+h 

Nun, wenn ich in meiner Umgebung haben ein Objekt h genannt, würde ich kein Problem haben:

h = 4 
g(2) 

## should be 6 

Jetzt , ich habe eine andere Funktion:

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

ich würde erwarten:

rm(h) 
f() 

## should be 5, isn't it? 

Stattdessen bekomme ich einen Fehler

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

Ich würde erwarten, g in der Umgebung von f ausgewertet werden, so dass die h in f wird die h in g gebunden sein, wie es war wenn ich g innerhalb der .GlobalEnv ausgeführt habe. Dies passiert nicht (offensichtlich). irgendeine Erklärung warum? wie man dies überwindet, so dass die Funktion innerhalb der Funktion (z.B. g) unter Verwendung der umgebenden Umgebung bewertet wird?

+0

ich keine Antwort, aber es scheint, als ob R für alle Variablen auf den globalen Bereich sieht entweder nicht in der definierten Funktionsaufruf oder als Parameter übergeben. –

Antwort

7

Es gibt einen Unterschied zwischen der umschließenden Umgebung einer Funktion, und seinem (parent) Auswertungsrahmen.

Die umschließende Umgebung wird festgelegt, wenn die Funktion definiert ist. Wenn Sie Ihre Funktion g an der R-Eingabeaufforderung definieren:

g = function(x) x+h 

dann die umschließenden Umgebung von g wird die globale Umwelt. Nun, wenn Sie g aus einer anderen Funktion aufrufen:

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

die Mutterbewertungsrahmen ist f ‚s-Umgebung. Dies ändert jedoch nichts an gs einschließender Umgebung, die ein festes Attribut ist, das nicht davon abhängt, wo es ausgewertet wird. Aus diesem Grund wird der Wert h, der in f definiert ist, nicht übernommen.

Wenn Sie g wollen innerhalb f den Wert von h definiert verwenden, dann sollten Sie auch definieren g innerhalb f:

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

Jetzt g s Umwelt ‚s-Umgebung umschließt wird f sein‘ (aber bewusst sein, , diese g ist nicht dasselbe wie die g, die Sie zuvor an der R-Eingabeaufforderung erstellt haben).

Alternativ können Sie die umschließenden Umgebung von g wie folgt ändern:

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