2014-01-17 7 views
5

Ich habe eine Funktion, die eine Umgebung darin erstellt, und ich möchte diese Umgebung der globalen Umgebung zuweisen. Derzeit kann ich das durch die Umwelt zu globalenv() als letzten Schritt der Zuordnung - wie folgt:Effiziente Verschiebung der Umgebung von der Funktion in die globale Umgebung

funfun <- function(inc = 1){ 
    dataEnv <- new.env() 
    dataEnv$d1 <- 1 + inc 
    dataEnv$d2 <- 2 + inc 
    dataEnv$d3 <- 2 + inc 
    assign('dataEnv', dataEnv, envir = globalenv()) 
} 

Es fühlt sich an wie ich in der Lage sein soll, etwas zu tun dataEnv persisit zu machen, wenn die Funktion funfun Ende (Kopieren speichern die Umgebung am Ende) aber meine Versuche, wie dataEnv <- new.env(parent = globalenv()), haben nicht funktioniert.

Warum schlägt es fehl? Ist das möglich?

Auch, was ist der effizienteste Weg, dies zu tun?

Meine Tabellen sind manchmal sehr groß, und das Kopieren wird ein Problem, wenn das Projekt wächst.

Antwort

5

Ihre Umgebung nicht zerstört werden, wenn Sie die Funktion beenden. Sie müssen nur einen Verweis darauf zurückgeben.

funfun <- function(inc = 1){ 
    dataEnv <- new.env(parent=globalenv()) 
    dataEnv$d1 <- 1 + inc 
    dataEnv$d2 <- 2 + inc 
    dataEnv$d3 <- rnorm(10000) 
    return(dataEnv) 
} 


myEnv <- funfun() 
object.size(myEnv) 

ein paar Sachen aus

head(myEnv$d3) 
+0

Ist die Rücksendung erforderlich? Oder ist es genug, nur DataEnv als letzte Zeile der Funktion zu haben? Ich bin ewig unsicher über Rückmeldungen in r. – ricardo

+0

Rückkehr ist nicht erforderlich, Sie können nur den Wert am Ende setzen. Wenn Sie Zweifel am Stil haben, habe ich kürzlich diese http://google-styleguide.googlecode.com/svn/trunk/Rguide.xml gelesen. Ich denke, dass sie in einigen Beispielen 'return' verwenden. Aber ist nur eine Frage des Geschmacks. – Usobi

+0

Dies scheint eine "Garbage Collection" -Frage aufzuwerfen. Angenommen, Sie geben die Umgebungsreferenz nicht zurück? Wie erkennen Sie die Existenz von 'dataEnv', wenn Sie also nichts anderes löschen können, wenn Sie nicht wollen? –

-1

Normalerweise, wenn ich etwas zu einem globalen Umfeld zuordnen mag ich nur

varname <<- value 
+0

Wont Holen Sie sich das Umfeld dieser Kopie, die innerhalb der Funktion ist, wie sie es von innen nach außen der Schließung bewegt? – ricardo

+0

Ja. Persönlich würde ich mit Usobis Antwort gehen, aber das ist, was Sie tun würden, wenn Sie diesen spezifischen Variablennamen der globalen Umgebung zuweisen wollten (die aussieht, als ob Sie in dem bereitgestellten Code vorgingen). 'myEnv << - dataEnv' wäre der Code, der dasselbe wie oben tut. –

Verwandte Themen