2015-06-15 5 views
9

Ich habe über R-Umgebungen zu lesen, und ich versuche, mein Verständnis mit einem einfachen Beispiel zu testen:Welche Funktion identifiziert den Namen der umgebenden Umgebung einer R-Variablen?

> f <- function() { 
+ x <- 1 
+ environment(x) 
+ } 
> 
> f() 
NULL 

Ich gehe davon aus bedeutet dies, dass das Objekt x von der NULL benannte Umgebung eingeschlossen ist, aber wenn ich versuche, in dieser Umgebung alle Objekte aufzulisten, zeigt R eine Fehlermeldung:

> ls(NULL) 
Error in as.environment(pos) : using 'as.environment(NULL)' is defunct 

Also ich frage mich, ob es eine eingebaute Funktion ich auf der Befehlszeile verwenden können, die die Umwelt zurückkehren Geben Sie den Namen des Objekts an. Ich versuchte dies:

> environment(x) 
Error in environment(x) : object 'x' not found 

aber das zurück auch einen Fehler. Jede Hilfe wird sehr geschätzt.

+2

'x' wird zerstört, wenn die Funktion ausgeführt wird – jenesaisquoi

+2

Die' environment' Funktion gibt die Umgebung eines 'function' Objekts zurück und nicht die eines beliebigen Objekts. – nicola

+0

@nicola Danke- das war mir nicht bewusst. – Robert

Antwort

6

Variablen, die in Funktionsaufrufen erstellt wurden, werden bei Ausführung der Funktion zerstört (es sei denn, Sie erstellen sie speziell in anderen permanenten Umgebungen). Wie @joran hervorhob, wird beim Aufruf einer Funktion eine temporäre Umgebung erzeugt, in der lokale Variablen definiert sind und die zerstört wird, wenn die Funktion ausgeführt wird (dieser Speicher wird freigegeben). Wenn @MrFlick jedoch darauf hinweist, dass die Funktion eine Funktion zurückgibt, behält die zurückgegebene Funktion einen Verweis auf die Umgebung bei, in der sie erstellt wurde. Sie können mehr über 'scope',-lesen. In R gibt es verschiedene Möglichkeiten, wie Sie Ihre Variablen in bestimmte Umgebungen definieren können.

f <- function() { 
    x <<- 1 # create x in the global environment (or change it if it's there) 
    ## or `assign` x to a value 
    ## assign(x, value=1, envir=.GlobalEnv) 
} 
environment(f) # where was f defined? 
exists("x", envir=.GlobalEnv) 
# [1] TRUE 
+2

Eine andere Möglichkeit, Ihren Kommentar oben zu formulieren, wäre zu sagen, dass bei der Ausführung von "f" R eine Umgebung für "f" erstellt, die für die Dauer der Ausführung der Funktion andauert. Aber sobald "f" getan ist, ist die Umgebung (und alles, was darin ist) verloren. – joran

+1

@joran Nun, die Umgebung einer Funktion kann existieren, nachdem die Funktion existiert, wenn diese Funktion eine andere Funktion oder eine Formel zurückgibt. 'f <-Funktion (x) {a <-x + 1; Funktion() a}; Umgebung (f (5)) '. In diesem Fall wird jedes Mal, wenn die Funktion ausgeführt wird, eine neue Umgebung erstellt, die nach dem Beenden der Funktion sowie der darin enthaltenen Variablen "a" weiterhin existiert. 'x <-f (5); x() ' – MrFlick

+1

Danke für die informative Erklärung. – Robert

6

Das Paket pryr einige nette Funktionen, die diese Art von Dingen zu tun hat. Zum Beispiel gibt es eine Funktion where genannt, die Ihnen die Umgebung eines Objekts:

library(pryr) 
f <- function() { 
    x <- 1 
    where("x") 
} 
f() 
<environment: 0x0000000013356f50> 

So ist die Umgebung von x war die temporäre Umgebung von Funktion erstellt f(). Wie bereits erwähnt, wird diese Umgebung nach dem Ausführen der Funktion zerstört, so dass Sie jedes Mal, wenn Sie f() ausführen, ein anderes Ergebnis erhalten.

+0

Danke, Carlos - ich werde es versuchen. – Robert

Verwandte Themen