In R source()
lade ich einige Funktionen:
source("functions.R")
Ist es möglich, die Liste aller in dieser Datei definierten Funktionen abzurufen? Als Funktionsnamen. (Vielleicht source()
kann es selbst irgendwie zurückgeben?).
PS: Der letzte Ausweg wäre, das source()
zweite Mal aufzurufen local({ source(); })
und dann ls()
Innen- und Filterfunktionen auszuführen, aber das ist zu kompliziert - gibt es eine einfachere und weniger ungeschickte Lösung?
source()
, aber dieser alte Thread könnte für Sie von Interesse sein.envir <- new.env() source("functions.R", local=envir) lsf.str(envir)
Antworten:
Ich denke, der beste Weg wäre, die Datei in eine temporäre Umgebung zu bringen. Fragen Sie diese Umgebung nach allen Funktionen ab und kopieren Sie diese Werte in die übergeordnete Umgebung.
quelle
new.env()
anstelle des eleganten, beilocal({ })
dem ich nicht sicher bin, ob es mitassign
dem übergeordneten Frame funktionieren würde .local()
? Und übrigens, 2) was Sie in der for-Schleife tun: Gibt es keine Funktion zum Zusammenführen von Umgebungen?attach
kann verwendet werden, um eine Umgebung mit einer anderen zu verbinden. Sie müssen jedoch daspos
Argument verwenden, anstatt das anzugebenparent.frame
. Und es funktioniert nur gut zum Kopieren der gesamten Umgebung. Mit der MrFlick-for
Schleife können Sie nur die Funktionen kopieren.Es ist etwas klobig, aber Sie können Änderungen an den Objekten vor und nach dem
source
Aufruf wie folgt betrachten.quelle
Ich denke, dass dieser reguläre Ausdruck fast jeden gültigen Funktionstyp (Binäroperator, Zuweisungsfunktionen) und jedes gültige Zeichen in einem Funktionsnamen erfasst, aber ich habe möglicherweise einen Randfall übersehen.
quelle
.
und Zuweisungsfunktionen beginnen (`foo<-`<- function(x, value)
vorhanden.=
für die Zuweisung, dies wird keine meiner Funktionen` d d` <- function(x)
derzeit nicht gefangen werden. Ich möchte nicht, dass der reguläre Ausdruck zu albern wird, obwohl ich ihn vielleicht noch einmal besuchen werde.assign
,<<-
und->
. Und es wird sehr schwierig sein, diesen Ansatz für Funktionen zu berücksichtigen, die innerhalb von Funktionen definiert sind, sich jedoch nicht in der Sourcing-Umgebung befinden. Ihre Antwort sollte in Standardfällen sehr gut funktionieren, aber Sie möchten eigentlich keinen R-Parser aus Regex schreiben.Wenn dies Ihr eigenes Skript ist, damit Sie die Kontrolle über die Formatierung haben, ist eine einfache Konvention ausreichend. Stellen Sie einfach sicher, dass jeder Funktionsname beim ersten Zeichen in seiner Zeile beginnt und dass das Wort
function
auch in dieser Zeile erscheint. Jede andere Verwendung des Wortesfunction
sollte in einer Zeile erscheinen, die mit einem Leerzeichen oder einer Registerkarte beginnt. Dann ist eine einzeilige Lösung:Die Vorteile dieses Ansatzes sind die folgenden
es ist sehr einfach . Die Regeln werden einfach angegeben und es wird nur eine einfache Zeile R-Code benötigt, um die Funktionsnamen zu extrahieren. Regex ist auch einfach und für eine vorhandene Datei sehr einfach zu überprüfen - greifen Sie einfach nach dem Wort
function
und prüfen Sie, ob jedes angezeigte Vorkommen der Regel entspricht.Die Quelle muss nicht ausgeführt werden. Es ist völlig statisch .
In vielen Fällen müssen Sie die Quelldatei überhaupt nicht ändern, in anderen Fällen werden nur minimale Änderungen vorgenommen. Wenn Sie das Skript in diesem Sinne von Grund auf neu schreiben, ist es noch einfacher zu arrangieren.
Es gibt viele andere Alternativen entlang der Idee von Konventionen. Sie könnten einen komplexeren regulären Ausdruck haben oder
# FUNCTION
am Ende der ersten Zeile einer Funktionsdefinition hinzufügen, wenn Sie das Skript von Grund auf neu schreiben und dann diesen Satz herausgreifen und das erste Wort in der Zeile extrahieren, aber der Hauptvorschlag hier scheint besonders attraktiv aufgrund seiner Einfachheit und der anderen aufgeführten Vorteile.Prüfung
quelle
lapply(x, function(y) dostuff(y))
würde dies brechen# TODO
füge oft meinen Code ein, damit ich zum Beispiel meine Aufgaben erledigen kann. Eine andere Möglichkeit in der gleichen Richtung wäre,# FUNCTION
am Ende der ersten Zeile einer Funktionsdefinition zu schreiben .Dadurch wird der im Beitrag verwendete Code aus meinem Kommentar angepasst, um nach einer Folge von Token (Symbol, Zuweisungsoperator, dann Funktion) zu suchen, und es sollten alle definierten Funktionen erfasst werden. Ich bin nicht sicher, ob es als Antwort von MrFlick robust ist, aber es ist eine andere Option:
quelle