2014-10-27 8 views
5

Ich bin auf dieses Konzept ein paar Mal gestoßen, aber ich kenne den Namen nicht, also kann ich es nicht googeln, um mehr zu erfahren. Im Grunde genommen, wenn sie durch Funktionen suchen oder auch einfache Befehle andere geschrieben haben ich oft etwas sehen wie folgt aus:Funktion (x) in R: Schreiben einer "Funktion" ohne Definition einer Funktion?

apply(dataset, 1:2, function(x) 10 * x) 

In diesem Fall konnte ich herausfinden, dass irgendwie diese „falsche Funktion“ Funktion (x) würde jedes Element des Datasets einfach mit 10 multiplizieren. Dies scheint ein nützliches Feature zu sein, aber ich bin mir immer noch nicht sicher, wann oder wie Sie es verwenden. Ist das wirklich eine Funktion? Oder funktioniert es nur innerhalb der anwendbaren Funktionsfamilie? Gibt es einen Namen für dieses Ding?

+4

Es wird eine anonyme Funktion genannt. Das sollte beim Googlen helfen. – joran

Antwort

8

Diese werden "anonyme Funktionen" genannt, und ja, sie sind echte Funktionsobjekte, die vor der Verwendung zufällig keinem Symbol zugewiesen wurden.

Hier ist das entsprechende Bit aus dem R language documentation:

allgemeinen Funktionen Symbole zugeordnet sind, aber sie müssen nicht sein. Der vom Funktionsaufruf zurückgegebene Wert ist eine Funktion. Wenn dieser Name nicht angegeben wird, wird er als anonyme Funktion bezeichnet. Anonyme Funktionen werden am häufigsten als Argumente für andere Funktionen wie die anwendbare Familie oder äußere verwendet.

Obwohl sie typischerweise in *apply() Funktionen verwendet, müssen sie nicht sein, wie hier zu sehen, zum Beispiel

(function(x,y){x*y + x/y})(2,5) 
# [1] 10.4 
6

Sie meinen, eine lambda (anonyme Funktion)?

`{` <- function(...) 
    base::`{`(
    if (length(sys.calls()) >= 4 && 
     identical(as.character(sys.call()[[1]]), "{") && 
     identical(as.character(sys.call(-4)[[1]]), "{")) 
     base::`{`(fn <- new('function'), 
     formals(fn) <- alist(x=), body(fn) <- sys.call(), fn) 
    else eval.parent(substitute(base::`{`(...))) 
) 

Dann können Sie tun Dinge wie:

sapply(1:10, {{x + 5}}) 
# [1] 6 7 8 9 10 11 12 13 14 15 

Dies ist näher an Sprachen wie Ruby oder Coffeescript, die nicht brauchen, um ein Schlüsselwort rufen Sie könnte so etwas wie dies in Ihrer ~/.Rprofile Datei setzen um ein Lambda zu machen (dort verwenden sie ->, aber das ist bereits in R genommen, also habe ich Doppelstreben verwendet). Ich bin gerade auf diese Idee gekommen. Wenn es Bugs gibt, lass es mich wissen.

+2

Das hilft wahrscheinlich OP überhaupt nicht, aber es ist eine interessante Idee. Ich, ich bin teilweise zu überladen '->'.] (Https://gist.github.com/klmr/25dc765211c59bb749b0) –

+0

Mein Problem damit ist, dass die meisten Leute, mit denen ich arbeite, tatsächlich '->' verwenden für die Zuweisung bei der zufälligen Munging in der Konsole - einfacher als an den Anfang zurück –

+0

Ich denke, Sie könnten '%>%' in 'Basis :: \' <- \ ''? –

Verwandte Themen