2016-06-01 7 views
1

Ich versuche, eine Variable aus einer Funktion in der globalen Umgebung zu speichern, aber keine der gefundenen Lösungen SO post oder different SO post funktionierte für mich. Dies ist ein extrem vereinfachtes Beispiel zur Veranschaulichung meines Problems. Ich kann nicht einfach <<- verwenden, um v global zu machen, weil meine eigentliche Funktion mehrere Dutzend Variablen erzeugt.Speichern von Variablen aus einer Funktion in der globalen Umgebung

-Code (main_file.R)

source("function_me.R") 
#environment(doGlobalThing) <-parent.frame(2) #didnt work 
doGlobalThing() 
v #cant get to this var from the global environment 

-Code (function_me.R)

doGlobalThing<-function(){ 
    #eval(v<-'hi',env=parent.frame(2)) #tried this, didnt work 
    v<-'hi' 
} 
+1

Arbeiten Sie nicht gegen das Design der Sprache. Lernen Sie die funktionale Programmierung. – Roland

+0

@Roland, Können Sie (kurz) erklären, warum meine Idee, eine neue Menge globaler Variablen zu erstellen, in einer LEEREN globalen Umgebung falsch ist, die auf einem Grundsatz der funktionalen Programmierung basiert? – Rilcon42

+2

Es gibt absolut keinen Vorteil, dies zu tun, als das, was Sie von der Funktion benötigen, z. B. in einer Liste, zurückzugeben. Wie Sie jedoch bemerken, stellt dies für Sie eine Belastung dar, die Sie beachten müssen, dass Ihre Funktion Site-Effekte aufweist und um sicherzustellen, dass dies keine Probleme verursacht. Und das bedeutet natürlich, dass Sie Ihren Code nicht wirklich anderen geben oder einfach wiederverwenden können. Die einzige Situation, in der dies Sinn macht, ist, wenn Sie versuchen, durch Referenz zu referenzieren und an Ort und Stelle zu modifizieren, aber dann sollten Sie es in einer anderen Umgebung als in der globalen tun (oder Referenzklassen verwenden). – Roland

Antwort

4

könnten Sie assign verwenden:

assign("v","hi",envir = globalenv()) 

Dies erfordert, dass Sie den Namen von die globale Zielvariable als eine Zeichenkette, aber es kann leicht sein, dies sogar mit einem Vektor von Dutzenden solcher Dinge zu tun.

This question diskutiert die Unterschiede zwischen assign und <<-. Der Hauptunterschied besteht darin, dass Sie mit assign die Umgebung angeben können. So können Sie Daten problemlos in einer nicht globalen, aber dauerhaften Umgebung speichern, sodass Sie z. emulieren statische Variablen in R. Während es möglich ist, assign zu verwenden, um die globale Umgebung zu ändern, sollten Sie sich bewusst sein, dass es selten eine gute Sache ist, dies zu tun. Es besteht die Gefahr, versehentlich Daten zu überschreiben, die nicht überschrieben werden sollen. Code, der globale Variablen stark verwendet, kann fast immer in saubereren Code umgestaltet werden, was nicht der Fall ist. Wenn Sie viele heterogene Daten von einer Funktion in die aufrufende Umgebung holen müssen, wäre die sauberste Lösung, die benötigten Daten in einer Liste zurückzugeben.

Die accepted answer beendet seine Diskussion über <<- und assign mit einem guten Zitat:

Das Böse und Falsche Verwendung ist Variablen in der globalen Umgebung zu ändern.

+0

Das ist richtig, aber ich hatte auf eine allgemeinere Lösung gehofft .... vorzugsweise eine Methode, um alle Variablen, die in der Funktion global mit einem Aufruf erstellt wurden, – Rilcon42

+0

Ich könnte genauso einfach '<< -' als Ihre Lösung verwenden, obwohl Ihr war neu für mich – Rilcon42

+0

TI tun Sie es in einem Anruf, verwenden Sie 'zuweisen' in entweder eine 'for' Schleife oder eine' apply' Funktion. Es stellt sich aber immer noch die Frage, ob sich der Nebeneffekt lohnt. Es ist oft besser, Werte zu speichern, auf die in der globalen Umgebung entweder in einer Liste in den Optionen oder in einer anderen Umgebung gespeichert und zugegriffen werden muss. – Benjamin

Verwandte Themen