2017-04-25 2 views
2

Sind die folgenden zwei äquivalent, d. H. Definieren sie die gleiche Funktion?Syntax für Funktionen in R?

function(df) {lm(mpg ~ wt, data=df)} 

und

function(df) lm(mpg ~ wt, data=df) 

Insbesondere Ich bin verwirrt darüber, warum es möglich ist, Funktionen ohne geschweifte Klammern in R. geschweiften Klammern

sind notwendig für die Definition einer Funktion nur zu schreiben, wenn die Funktionsdefinition erstreckt sich über mehr als eine Zeile?

(vielleicht etwas darüber, wie R und Python technisch die Semikolons von C unterstützen, aber es ist eine schlechte Praxis betrachtet, sie zu benutzen?)

Dies scheint vielleicht zu erklären, warum Menschen tun, verwenden im Allgemeinen nicht geschweiften Klammern bei der Definition anonyme Funktionen, weil anonyme Funktionen in der Regel kurz sind und somit in eine Zeile passen, so dass geschweifte Klammern nicht notwendig sind.

Aber wäre es möglich, anonyme Funktionen zu übergeben, deren Definitionen länger als eine Zeile sind (das wäre wahrscheinlich eine schlechte Übung, aber das ist nicht mein Punkt)?

Wenn es möglich ist, erfordert das geschweifte Klammern?

+0

@jogo Du hast Recht, dankt es für den Hinweis out - in einer Bearbeitung behoben – Chill2Macht

+2

In Bezug auf "ist es möglich", können Sie es einfach versuchen. Zum Beispiel: y = {x = 1; x + 2} 'funktioniert, und Sie können herausfinden, wie Sie experimentieren. Wie gesagt, die geschweiften Klammern umhüllen einen Ausdruck und sind gerade in Funktionen nützlich. – Frank

+0

@jogo, bitte als Antwort posten ... –

Antwort

9

In Ihrem Beispiel geht es nicht um anonyme Funktionen. Es ist ungefähr { und }, die nicht benötigt werden, wenn es nur einen einzigen Ausdruck zwischen ihnen gibt.
- Ein Ausdruck kann länger als eine Zeile sein.
- In einer Zeile kann es mehr als einen Ausdruck geben (durch Semikolon getrennt).
- Eine anonyme Funktion ist nicht auf eine Zeile beschränkt.

Sie können die Dokumentation für { wie gewohnt finden: help('{')

Beispiele:

x <- 3; y <- 4; z <- x + y # more than one expression on a line 

z <- x + 
y + 
2 # the expression x+y+2 extends over three lines 

x <- matrix(1:30,3) 
apply(x, 1, function(x) sd(x)/ 
median(x)) # anonymous function definition on two lines 

Manchmal muss man über Zeilenumbrüche im Code vorsichtig sein. In einigen Situationen werden sie vom Interpreter als Ende der syntaktischen Einheit erkannt. "Sei vorsichtig" in diesen Situationen bedeutet:
Geben Sie dem Interpreter einen Grund, in der nächsten Zeile zu suchen.
Das wird nicht funktionieren:

x <- 11:15 
x 
[3] # because of the linebreak it is not x[3] 

Aber dies wird tun:

x[ 
3 
] 
# the interpreter was searching for the ']' (till it was found) 

Dies ist die Situation, in der ich meine Lektion gelernt:

if (...) { ... } 
else { ... }  # unexpected 'else' !!! 

Von diesem Zeitpunkt an ich bin Codierung auf diese Weise:

if (...) { 
    ... 
} else { 
    ... 
} 

Siehe Unexpected 'else' in "else" error

A nonanonymous Funktion (d.h.eine benannte Funktion) ist nichts anderes als eine Funktionsdefinition, die durch Zuweisung mit einem Objektnamen verbunden ist:

fname <- function(...) ... 

zur späteren Wiederverwendung. Sie können es auch dort, wo normalerweise eine anonyme Funktion zu finden ist:

x <- matrix(1:30,3) 
apply(x, 1, FUN=(mysuperfunc <- function(x) sd(x)/median(x))) 

aber dies ist das gleiche mit dem besseren Lesbarkeit:

mysuperfunc <- function(x) sd(x)/median(x) 
x <- matrix(1:30,3) 
apply(x, 1, FUN=mysuperfunc) 
+3

Sie sollten wahrscheinlich darauf hinweisen, dass Dokumentation für {. – Roland