2016-11-08 5 views
2

Ich versuche gemeinsame Codezeilen in einem ziemlich großen R-Skript in encapsulated Funktionen ... aber verwendet auszubrechen, sie scheinen nicht die beabsichtigte Code ausgeführt werden, wenn sie aufgerufen. Ich habe das Gefühl, dass mir ein konzeptionelles Stück fehlt, wie R funktioniert, oder funktionale Programmierung im Allgemeinen.R-Funktionen, die Funktionen ausführen

Beispiele:

Hier ist ein Stück Code nennen Ich mag würde den Arbeitsbereich löschen -

clearWorkSpace <- function() { 
    rm(list= ls(all=TRUE)) 
} 

Wie bereits erwähnt, führt der Code innerhalb der Funktion als erwartet, aber wenn die Eltern Funktion wird aufgerufen, die Umgebung wird nicht gelöscht.

Auch hier ist eine Funktion, um alle Abhängigkeitsdateien gedacht laden -

loadDependencies <- function() { 
    dep_files <- list.files(path="./dependencies") 
    for (file in dep_files) { 
    file_path <- paste0("./dependencies/",file) 
    source(file_path,local=TRUE) 
    } 
} 

Wenn möglich, würde es groß sein, um Funktionen zu kapseln Code in leicht zu lesen. Danke im Vorraus für deine Hilfe.

Antwort

3

Was Sie anrufen Arbeitsbereich wird genauer als die globale Umgebung bezeichnet.

Funktionen auszuführen, die in ihren eigenen Umgebungen. Dies ist beispielsweise der Grund, warum Sie die in der globalen Umgebung definierten Variablen innerhalb der Funktion nicht sehen. Auch, wie eine Funktion weiß, eine Variable mit dem Namen x zu verwenden, die im Funktionskörper definiert ist, anstatt einige x, die Sie möglicherweise in Ihrer globalen Umgebung haben.

Die meisten Funktionen ändern nicht die externen Umgebungen, was gut ist! Es ist das funktionale Programmierparadigma. Funktionen, die Umgebungen ändern, z. B. rm und source, verwenden normalerweise Argumente, sodass Sie explizit angeben können, welche Umgebung geändert wird. Wenn Sie bei ?rm aussehen werden Sie ein envir Argument sehen, und das Argument ist, das meiste, was sein Einzelheiten Abschnitt beschreibt. source hat ein local Argument:

local - TRUE, FALSE oder eine Umgebung, zu bestimmen, wo die analysierten Ausdrücke ausgewertet werden. FALSE (Standardeinstellung) entspricht den Arbeitsbereich des Benutzers (die globale Umwelt) und TRUE in die Umgebung, aus der source genannt wird.

Sie legen explizit local = TRUE wenn Sie source nennen, die source ausdrücklich erzählt die lokale (innerhalb der Funktion) -Umgebung nur zu ändern, so natürlich Ihre globale Umwelt unberührt ist!


Um die Funktionen machen arbeiten, wie ich nehme an, Sie wollen, dass sie, Sie clearWorkSpace wie dies ändern könnte:

clearWorkSpace <- function() { 
    rm(list= ls(all=TRUE, envir = .GlobalEnv), envir = .GlobalEnv) 
} 

Und für loadDependencies einfach die local = TRUE löschen.(Oder mehr eingestellt explizit local = FALSE oder local = .GlobalEnv) Obwohl Sie könnten neu schreiben sie in einer R-ähnliche Art und Weise:

loadDependencies = function() { 
    invisible(lapply(list.files(path = "./dependencies", full.names = TRUE), source)) 
} 

für diese beiden (vor allem mit der vereinfachten Abhängigkeit oben ausgeführt) Ich, ob Sie in Frage würde wirklich brauchen diese in Funktionen eingewickelt. Könnte besser sein, R zu bekommen nur die Gewohnheit, einen Neustart, wenn Sie an einem Projekt arbeiten und halten invisible(lapply(list.files(path = "./dependencies", full.names = TRUE), source)) am Anfang des Skripts wieder aufnehmen ...


Weitere Lesung am Umgebungen ist es The Evironments Section of Advanced R. Insbesondere gibt es mehrere Möglichkeiten, Umgebungen anzugeben, die für verschiedene Anwendungsfälle nützlich sein können, anstatt die globale Umgebung fest zu codieren.

1

Theoretisch brauchen Sie nur, wie etwas zu tun ist:

rm(list= ls(all=TRUE, envir = .GlobalEnv)) 

Ich meine, Sie explizit die Umwelt gesetzt (auch hier ist es besser pos Argument zu verwenden). aber dies wird auch die clearWorkSpace Funktion löschen, da es in der globalen Umgebung definiert ist. Dies wird bei einem rekursiven Aufruf fehlschlagen.

Persönlich verwende ich nie rm innerhalb einer Funktion oder einem lokalen Anruf. Mein Verständnis, rm ist beabsichtigt, von der Konsole aufgerufen werden, um den Arbeitsbereich zu löschen.

Verwandte Themen