2016-08-08 14 views
0

ich gespeichert habe in einer Liste „funList“ wie soAbrufen der Name einer Funktion, nachdem es

funList <- list(type = function() { 
    funname <- ??? 
    print(funname) # should return "type" } 
) 

In anderen Teilen meines Codes nenne ich diese Funktion aber nie eine Funktion namens „Typ“ bezeichnet habe sein Name, sondern durch seine Position in der Liste, zum Beispiel:

funList[[1]]() 

in Wirklichkeit Funktion „Typ“ ist natürlich Art und Weise komplizierter, aber es ist ein Teil in seiner Funktion Körper, der die Funktion der eigenen Namen verwendet. Wie kann ich den Namen abrufen, wenn ich ihn nur nach Position anrufe? Mit anderen Worten, wie kann ich den letzten Funktionsaufruf "type" drucken lassen.

+3

Sie keine benannte Funktion erstellt haben. Sie haben eine benannte Liste erstellt. Ihre anonyme Funktion kann den Namen, den Sie in der benannten Liste angegeben haben, nicht kennen. Sie müssten eine Wrapperfunktion erstellen, die gleichzeitig die Liste und die Funktion erstellt und einen geeigneten Bereich zum Speichern des Werts erstellen kann. Das würde natürlich brechen, wenn Sie die Liste überhaupt umbenennen würden. Was versuchst du wirklich? Vielleicht gibt es einen besseren Weg. – MrFlick

+0

Ich verstehe, danke. Im weitesten Sinne wird dieser Code Teil einer bestimmten DSL sein, die ich schreibe, um Funktionen auf bestimmte Spalten in einem Datenrahmen anzuwenden. Ich muss es so implementieren, dass zuerst diese Funktionen gesammelt und in einem Container (funList) gespeichert und dann nacheinander auf Spalten in einem Datenrahmen angewendet werden. Vielleicht könnte der Name der Spalte, d. H. Typ, auch als Funktionsargument erscheinen, aber ich dachte, es wäre schöner, es so zu schreiben wie ich. Wie auch immer, ich würde wirklich einige Hinweise darauf schätzen, wie ich die von Ihnen erwähnten Wrapper-Lösungen entwickeln könnte. –

+0

Die Art der Sache, die Sie versuchen zu erreichen, wird in R mit Nicht-Standard-Bewertung erreicht. Dies ist ein komplexes und subtiles Thema. Für eine gute Einführung siehe http://adv-r.had.co.nz/Computing-on-the-language.html#nse – Paul

Antwort

0

Ein bisschen eine hacky Lösung, aber die Idee hier ist, die Nummer von match.call() zu extrahieren und den entsprechenden Funktionsnamen von names(funList) zu finden.

funList <- list(
    type = function() { 
    # Do something 
    getFunName(match.call()) 
    }, 
    bob = function() { 
    # Do something else 
    getFunName(match.call()) 
    } 
) 

getFunName <- function(call) { 
    names(funList)[as.numeric(gsub(".*?([0-9]+)(.*)", "\\1", as.character(call)[1]))] 
} 

Ausgang:

> funList[[1]]() 
[1] "type" 
> funList[[2]]() 
[1] "bob" 
+0

Wenn natürlich würde dies mit Dinge wie 'FunList [[1]] (2)' oder 'lapply (FunList, Funktion (f) f())' – MrFlick

+0

Danke - bearbeitet, um mit der ersten Ausgabe zu befassen, nicht sicher was um die Sekunde zu machen. Würde mich interessieren zu sehen, was andere sich einfallen lassen! –