Vor einiger Zeit wurde ich von Simon Urbanek vom R-Kernteam (glaube ich) zurechtgewiesen , weil er einem Benutzer empfohlen hatte, return
am Ende einer Funktion explizit aufzurufen (sein Kommentar wurde jedoch gelöscht):
foo = function() {
return(value)
}
stattdessen empfahl er:
foo = function() {
value
}
Wahrscheinlich ist in einer solchen Situation Folgendes erforderlich:
foo = function() {
if(a) {
return(a)
} else {
return(b)
}
}
Sein Kommentar gab Aufschluss darüber, warum return
es gut ist, nicht anzurufen, es sei denn, dies ist unbedingt erforderlich, aber dies wurde gelöscht.
Meine Frage ist: Warum nicht return
schneller oder besser anrufen und daher vorzuziehen?
return
ist auch im letzten Beispiel nicht notwendig. Das Entfernenreturn
kann es etwas schneller machen, aber meiner Ansicht nach liegt dies daran, dass R eine funktionale Programmiersprache sein soll.return
induziert einen nicht lokalen Sprung, und der explizite nicht lokale Sprung ist für FP ungewöhnlich. Eigentlich hat zum Beispiel Schema nichtreturn
. Ich denke, meine Kommentare sind als Antwort zu kurz (und möglicherweise falsch).return
,break
,continue
entweder, was ermüdend manchmal ist.Antworten:
Die Frage war: Warum ist ein (expliziter) Rückruf nicht schneller oder besser und daher vorzuziehen?
In der R-Dokumentation gibt es keine Aussage, die eine solche Annahme trifft.
Die Hauptseite? 'Funktion' sagt:
Ist es schneller ohne Rückruf?
Beide
function()
undreturn()
sind primitive Funktionen, und derfunction()
selbst gibt den zuletzt ausgewerteten Wert zurück, auch ohne diereturn()
Funktion einzuschließen.Das Aufrufen
return()
wie.Primitive('return')
bei diesem letzten Wert als Argument erledigt den gleichen Job, benötigt jedoch einen weiteren Aufruf. Damit dieser (oft) unnötige.Primitive('return')
Aufruf zusätzliche Ressourcen beanspruchen kann. Eine einfache Messung zeigt jedoch, dass der resultierende Unterschied sehr gering ist und daher nicht der Grund dafür sein kann, keine explizite Rückgabe zu verwenden. Das folgende Diagramm wird aus den auf diese Weise ausgewählten Daten erstellt:Das Bild oben kann auf Ihrer Plattform leicht abweichen. Basierend auf den gemessenen Daten verursacht die Größe des zurückgegebenen Objekts keinen Unterschied. Die Anzahl der Wiederholungen (auch wenn sie vergrößert sind) macht nur einen sehr kleinen Unterschied, der in realen Worten mit realen Daten und realem Algorithmus nicht gezählt werden konnte oder Ihren Skript läuft schneller.
Ist es besser ohne Rückruf?
Return
ist ein gutes Werkzeug, um "Blätter" von Code klar zu entwerfen, wo die Routine enden, aus der Funktion herausspringen und Wert zurückgeben soll.Es hängt von der Strategie und dem Programmierstil des Programmierers ab, welchen Stil er verwendet. Er kann kein return () verwenden, da dies nicht erforderlich ist.
R-Kernprogrammierer verwenden beide Ansätze, d. H. mit und ohne explizite return (), wie es in Quellen von 'Basis'-Funktionen zu finden ist.
Oft wird nur return () verwendet (kein Argument) und NULL zurückgegeben, wenn die Funktion bedingt gestoppt werden soll.
Es ist nicht klar, ob es besser ist oder nicht, da Standardbenutzer oder Analysten, die R verwenden, den wirklichen Unterschied nicht erkennen können.
Meiner Meinung nach sollte die Frage lauten: Besteht die Gefahr einer expliziten Rückgabe aus der R-Implementierung?
Oder, vielleicht besser, sollte der Benutzer, der Funktionscode schreibt, immer fragen: Was bewirkt es, wenn im Funktionscode keine explizite Rückgabe (oder Platzierung eines Objekts, das als letztes Blatt des Codezweigs zurückgegeben werden soll) verwendet wird?
quelle
return
, und es hängt von der Präferenz des Programmierers ab, ob er es verwendet oder nicht.return
ist wirklich das Letzte, worüber Sie sich Sorgen machen sollten.return
Funktionsaufrufe. Die Frage, die Sie stellen sollten , ist nicht die, die Sie am Ende vorschlagen. Stattdessen heißt es: „Warum sollte ich eine redundante verwendenreturn
? Welchen Nutzen bietet es? “ Wie sich herausstellt, lautet die Antwort "nicht viel" oder sogar "überhaupt nichts". Ihre Antwort weiß dies nicht zu schätzen.return
ist wie ein expliziter Kommentar, in dem neben einem Code "x um 1 erhöhen" stehtx = x + 2
. Mit anderen Worten, seine Aussage ist (a) völlig irrelevant und (b) es vermittelt die falschen Informationen. Weilreturn
die Semantik in R rein "diese Funktion abbrechen" ist. Es bedeutet nicht dasselbe wiereturn
in anderen Sprachen.Wenn alle damit einverstanden sind
return
ist am Ende des Körpers einer Funktion nicht erforderlichreturn
ist geringfügig schneller (laut @ Alans Test 4,3 Mikrosekunden gegenüber 5,1)Sollen wir alle
return
am Ende einer Funktion aufhören zu benutzen ? Das werde ich bestimmt nicht und ich möchte erklären, warum. Ich hoffe zu hören, ob andere meine Meinung teilen. Und ich entschuldige mich, wenn es keine klare Antwort auf das OP ist, sondern eher ein langer subjektiver Kommentar.Mein Hauptproblem bei der Nichtverwendung
return
ist, dass es, wie Paul betonte, andere Stellen im Körper einer Funktion gibt, an denen Sie sie möglicherweise benötigen. Und wenn Sie gezwungen sind,return
irgendwo in der Mitte Ihrer Funktion zu verwenden, warum nicht allereturn
Aussagen explizit machen? Ich hasse es, inkonsistent zu sein. Ich denke auch, dass der Code besser liest; Man kann die Funktion scannen und leicht alle Austrittspunkte und Werte sehen.Paulus benutzte dieses Beispiel:
Leider könnte man darauf hinweisen, dass es leicht umgeschrieben werden kann als:
Die letztere Version entspricht sogar einigen Programmiercodierungsstandards, die eine return-Anweisung pro Funktion befürworten. Ich denke, ein besseres Beispiel hätte sein können:
Das Umschreiben mit einer einzigen return-Anweisung wäre viel schwieriger: Es wären mehrere
break
s und ein kompliziertes System boolescher Variablen erforderlich, um sie weiterzugeben. All dies, um zu sagen, dass die Single-Return-Regel bei R nicht gut funktioniert. Wenn Sie sie also anreturn
einigen Stellen des Körpers Ihrer Funktion verwenden müssen, warum nicht konsistent sein und sie überall verwenden?Ich denke nicht, dass das Geschwindigkeitsargument gültig ist. Ein Unterschied von 0,8 Mikrosekunden ist nichts, wenn Sie sich Funktionen ansehen, die tatsächlich etwas bewirken. Das Letzte, was ich sehen kann, ist, dass es weniger tippt, aber hey, ich bin nicht faul.
quelle
return
in einigen Fällen besteht ein klarer Bedarf an der Aussage, wie @flodel gezeigt hat. Alternativ gibt es Situationen, in denen eine return-Anweisung am besten weggelassen wird, z. B. viele, viele kleine Funktionsaufrufe. In allen anderen Fällen, sagen wir 95%, spielt es keine Rolle, ob man verwendetreturn
oder nicht, und es kommt auf die Präferenz an. Ich verwende gerne return, da es in Ihrer Bedeutung expliziter und damit lesbarer ist. Vielleicht ist diese Diskussion mit<-
vs verwandt=
?return
Rückgabe eines Werts ist unsinnig, genauso wie das Schreibenif (x == TRUE)
stattif (x)
.foo
alsfoo <- function(x) if (a) a else b
(mit Zeilenumbrüchen nach Bedarf). Keine explizite Rückgabe oder Zwischenwert erforderlich.Dies ist eine interessante Diskussion. Ich finde das Beispiel von @ flodel ausgezeichnet. Ich denke jedoch, dass dies meinen Punkt veranschaulicht (und @koshke erwähnt dies in einem Kommentar),
return
der sinnvoll ist, wenn Sie einen Imperativ anstelle eines funktionalen Codierungsstils verwenden .Nicht um den Punkt zu belabouren, aber ich hätte so umgeschrieben
foo
:Ein funktionaler Stil vermeidet Statusänderungen wie das Speichern des Werts von
output
. In diesem Stilreturn
ist fehl am Platz;foo
sieht eher aus wie eine mathematische Funktion.Ich stimme @flodel zu: Die Verwendung eines komplizierten Systems boolescher Variablen in
bar
wäre weniger klar und sinnlos, wenn Sie dies getan habenreturn
. Was Aussagenbar
so zugänglich macht ,return
ist, dass sie in einem imperativen Stil geschrieben sind. In der Tat stellen die booleschen Variablen die "Zustands" -Änderungen dar, die in einem funktionalen Stil vermieden werden.Es ist wirklich schwierig,
bar
im funktionalen Stil umzuschreiben , weil es nur ein Pseudocode ist, aber die Idee ist ungefähr so:Die
while
Schleife wäre am schwierigsten umzuschreiben, da sie durch Zustandsänderungen an gesteuert wirda
.Der Geschwindigkeitsverlust, der durch einen Anruf bei verursacht wird,
return
ist vernachlässigbar, aber die Effizienz, die durch das Vermeidenreturn
und Umschreiben in einem funktionalen Stil erzielt wird, ist oft enorm. Esreturn
wird wahrscheinlich nicht helfen, neuen Benutzern zu sagen, dass sie die Verwendung einstellen sollen, aber es lohnt sich, sie zu einem funktionalen Stil zu führen.@Paul
return
ist im imperativen Stil erforderlich, da Sie die Funktion häufig an verschiedenen Punkten in einer Schleife beenden möchten. Ein funktionaler Stil verwendet keine Schleifen und benötigt daher keinereturn
. In einem rein funktionalen Stil ist der letzte Aufruf fast immer der gewünschte Rückgabewert.In Python erfordern Funktionen eine
return
Anweisung. Wenn Sie Ihre Funktion jedoch in einem funktionalen Stil programmiert haben, haben Sie wahrscheinlich nur einereturn
Anweisung: am Ende Ihrer Funktion.Nehmen wir an einem Beispiel aus einem anderen StackOverflow-Beitrag an, wir wollten eine Funktion, die zurückgegeben wird,
TRUE
wenn alle Werte in einem bestimmten Wertx
eine ungerade Länge haben. Wir könnten zwei Stile verwenden:In einem funktionalen Stil fällt der zurückzugebende Wert natürlich an die Enden der Funktion. Wieder sieht es eher wie eine mathematische Funktion aus.
@GSee Die darin beschriebenen Warnungen
?ifelse
sind definitiv interessant, aber ich glaube nicht, dass sie versuchen, die Verwendung der Funktion zu verhindern. In der Tatifelse
hat der Vorteil der automatischen Vektorisierung von Funktionen. Betrachten Sie beispielsweise eine leicht modifizierte Version vonfoo
:Diese Funktion funktioniert gut, wenn 1
length(a)
ist. Aber wenn Siefoo
mit einem neu geschrieben habenifelse
Funktioniert jetzt
foo
auf jeder Länge vona
. In der Tat würde es sogar funktionieren, wenna
es sich um eine Matrix handelt. Die Rückgabe eines Werts in der gleichen Form wietest
ein Feature, das bei der Vektorisierung hilft, ist kein Problem.quelle
return
es nicht zu einem funktionalen Programmierstil passt. Ob man zwingend oder funktional programmiert, irgendwann muss eine Funktion oder ein Unterprogramm etwas zurückgeben. Zum Beispiel erfordert die funktionale Programmierung in Python immer noch einereturn
Anweisung. Könnten Sie dies näher erläutern?ifelse(a,a,b)
ein Haustier von mir. Es scheint, als würde jede Zeile?ifelse
schreien: "Benutze mich nicht stattif (a) {a} else b
." Beispiel: "... gibt einen Wert mit der gleichen Form wietest
", "zurück. Wennyes
oder wenn sieno
zu kurz sind, werden ihre Elemente recycelt.", "Der Modus des Ergebnisses kann vom Wert vontest
", ", dem Klassenattribut des Ergebnisses, abhängen wird entnommentest
und ist möglicherweise für die ausyes
undno
"foo
macht es nicht viel Sinn; es wird immer TRUE oder zurückgebenb
. Wenn Sieifelse
es verwenden, werden 1 oder mehrere TRUEs und / oder 1 oder mehrereb
s zurückgegeben. Anfangs dachte ich, die Absicht der Funktion sei zu sagen: "Wenn eine Aussage WAHR ist, gib etwas zurück, andernfalls gib etwas anderes zurück." Ich denke nicht, dass das vektorisiert werden sollte, denn dann würde es "die Elemente eines Objekts zurückgeben, die WAHR sind, und für alle Elemente, die nicht WAHR sind, zurückkehrenb
.Es scheint, dass ohne
return()
es schneller ist ...____ BEARBEITEN__ _ __ _ __ _ __ _ __ _ ___
Ich
benchmark(fuu(x),foo(x),replications=1e7)
gehe zu einem anderen Benchmark ( ) und das Ergebnis ist umgekehrt ... Ich werde es auf einem Server versuchen.quelle
return()
, einer, wenn Sie dies nicht tun. Es ist am Ende einer Funktion völlig redundant, dafunction()
es den letzten Wert zurückgibt. Sie werden dies nur in vielen Wiederholungen einer Funktion bemerken, in denen intern nicht viel getan wird, so dass die Kosten für einenreturn()
großen Teil der gesamten Rechenzeit der Funktion ausmachen .Ein Problem, wenn 'return' nicht explizit am Ende gesetzt wird, besteht darin, dass der Rückgabewert plötzlich falsch ist, wenn am Ende der Methode zusätzliche Anweisungen hinzugefügt werden:
Dies gibt den Wert von zurück
dosomething()
.Jetzt kommen wir am nächsten Tag und fügen eine neue Zeile hinzu:
Wir wollten, dass unser Code den Wert von zurückgibt
dosomething()
, aber stattdessen nicht mehr.Bei einer expliziten Rückkehr wird dies wirklich offensichtlich:
Wir können sehen, dass dieser Code etwas Seltsames hat, und das Problem beheben:
quelle
return
ist keine Abkürzung, sondern der richtige Stil in der funktionalen Programmierung. Die Verwendung unnötigerreturn
Funktionsaufrufe ist ein Beispiel für die Frachtkultprogrammierung .return
Anweisung hinzuzufügen und nicht zu bemerken, dass es nicht ausgeführt wird. Sie können genauso gut einen Kommentar nach dem Wert hinzufügen, den Sie zurückgeben möchten, zBdosomething() # this is my return value, don't add anything after it unless you know goddam well what you are doing
Es ist schneller, weil
return
es eine (primitive) Funktion in R ist, was bedeutet, dass die Verwendung in Code die Kosten eines Funktionsaufrufs verursacht. Vergleichen Sie dies mit den meisten anderen Programmiersprachen, bei denenreturn
es sich um ein Schlüsselwort, aber nicht um einen Funktionsaufruf handelt: Es wird nicht in eine Laufzeitcode-Ausführung übersetzt.Das heißt, das Aufrufen einer primitiven Funktion auf diese Weise ist in R ziemlich schnell, und das Aufrufen
return
verursacht einen winzigen Overhead. Dies ist nicht das Argument für das Weglassenreturn
.Weil es keinen Grund gibt, es zu benutzen.
Weil es redundant ist und keine nützliche Redundanz hinzufügt .
Um es klar auszudrücken : Redundanz kann manchmal nützlich sein . Aber die meisten Redundanzen sind nicht von dieser Art. Stattdessen ist es von der Art, fügt visuelle Unordnung ohne Hinzufügen von Informationen: Es ist die Programmierung Äquivalent eines Füllwort oder Graphikmüll ).
Betrachten Sie das folgende Beispiel eines erklärenden Kommentars, der allgemein als schlechte Redundanz anerkannt wird, da der Kommentar lediglich umschreibt, was der Code bereits ausdrückt:
Die Verwendung
return
in R fällt in dieselbe Kategorie, da R eine funktionale Programmiersprache ist und in R jeder Funktionsaufruf einen Wert hat . Dies ist eine grundlegende Eigenschaft von R. Und sobald Sie R-Code aus der Perspektive sehen, dass jeder Ausdruck (einschließlich jedes Funktionsaufrufs) einen Wert hat, stellt sich die Frage: "Warum sollte ich verwendenreturn
?" Es muss einen positiven Grund geben, da standardmäßig nicht verwendet wird.Ein solcher positiver Grund besteht darin, ein vorzeitiges Verlassen einer Funktion zu signalisieren, beispielsweise in einer Schutzklausel :
Dies ist eine gültige, nicht redundante Verwendung von
return
. Solche Schutzklauseln sind jedoch in R im Vergleich zu anderen Sprachen selten, und da jeder Ausdruck einen Wert hat,if
erfordert ein reguläres nichtreturn
:Wir können sogar so umschreiben
f
:… Wo
if (cond) expr
ist das gleiche wieif (cond) expr else NULL
.Abschließend möchte ich drei häufigen Einwänden vorbeugen:
Einige Leute argumentieren, dass die Verwendung
return
Klarheit schafft, weil sie signalisiert, dass „diese Funktion einen Wert zurückgibt“. Wie oben erläutert, gibt jede Funktion in R etwas zurück.return
Als Marker für die Rückgabe eines Werts zu betrachten, ist nicht nur redundant, sondern auch aktiv irreführend .In ähnlicher Weise hat das Zen von Python eine wunderbare Richtlinie, die immer befolgt werden sollte:
Wie verstößt das Löschen redundanter Daten
return
nicht dagegen? Weil der Rückgabewert einer Funktion in einer funktionalen Sprache immer explizit ist: Es ist ihr letzter Ausdruck. Dies ist wieder das gleiche Argument über explizite Aussagen gegen Redundanz.Wenn Sie explizite Aussagen machen möchten, markieren Sie damit die Ausnahme von der Regel: Markieren Sie Funktionen, die keinen aussagekräftigen Wert zurückgeben und nur wegen ihrer Nebenwirkungen aufgerufen werden (z. B.
cat
). Außer R hat einen besseren Marker alsreturn
für diesen Fall :invisible
. Zum Beispiel würde ich schreibenAber was ist mit langen Funktionen? Wird es nicht leicht sein, den Überblick über die Rückgabe zu verlieren?
Zwei Antworten: Erstens nicht wirklich. Die Regel ist klar: Der letzte Ausdruck einer Funktion ist ihr Wert. Es gibt nichts zu verfolgen.
Noch wichtiger ist jedoch, dass das Problem bei langen Funktionen nicht das Fehlen expliziter
return
Marker ist. Es ist die Länge der Funktion . Lange Funktionen verstoßen fast (?) Immer gegen das Prinzip der Einzelverantwortung, und selbst wenn dies nicht der Fall ist, profitieren sie davon, dass sie aus Gründen der Lesbarkeit getrennt werden.quelle
return
, es anderen Sprachen ähnlicher zu machen. Aber das ist ein schlechtes Argument: Andere funktionale Programmiersprachen verwenden diese ebenfalls nichtreturn
. Es sind nur zwingende Sprachen, in denen nicht jeder Ausdruck einen Wert hat, die ihn verwenden.return
Unterstützungen ausdrücklich besser ist, und habe Ihre Antwort mit voller Kritik gelesen. Ihre Antwort hat mich veranlasst, über diese Ansicht nachzudenken. Ich denke, dass die Notwendigkeit,return
explizit (zumindest in meinem Fall) zu verwenden, mit der Notwendigkeit verbunden ist, meine Funktionen zu einem späteren Zeitpunkt besser überarbeiten zu können. Mit der Vorstellung, dass meine Funktionen einfach zu komplex sein könnten, kann ich jetzt sehen, dass ein Ziel zur Verbesserung meines Programmierstils darin besteht, die Codes so zu strukturieren, dass die Explizität ohne a erhalten bleibtreturn
. Vielen Dank für diese Überlegungen und Einsichten!Ich halte das für
return
einen Trick. In der Regel wird der Wert des letzten in einer Funktion ausgewerteten Ausdrucks zum Wert der Funktion - und dieses allgemeine Muster findet sich an vielen Stellen. Alle folgenden Punkte ergeben 3:Was
return
nicht wirklich ist , ist einen Wert zurückzugeben (dies geschieht mit oder ohne ihn), sondern die Funktion auf unregelmäßige Weise "auszubrechen". In diesem Sinne ist es das nächste Äquivalent der GOTO-Anweisung in R (es gibt auch break und next). Ich benutzereturn
sehr selten und nie am Ende einer Funktion.... dies kann so umgeschrieben werden,
if(a) a else b
dass es viel besser lesbar und weniger geschweift ist. Hier ist das überhaupt nicht nötigreturn
. Mein prototypischer Fall der Verwendung von "Rückkehr" wäre so etwas wie ...Im Allgemeinen deutet die Notwendigkeit vieler Rückgaben darauf hin, dass das Problem entweder hässlich oder schlecht strukturiert ist
<>
return
benötigt keine Funktion, um zu funktionieren: Sie können sie verwenden, um aus einer Reihe von Ausdrücken auszubrechen, die ausgewertet werden sollen.quelle
return
(mein hässliches Beispiel oben ist sehr künstlich): Angenommen, Sie müssen testen, ob ein Wert ist,NULL
oderNA
: Geben Sie in diesen Fällen eine leere Zeichenfolge zurück, andernfalls geben Sie dencharacter
Wert zurück. Aber ein Test vonis.na(NULL)
gibt einen Fehler, so dass es so aussieht, als ob er nur mitif(is.null(x)) return("")
und dann fortgesetzt werden kannif(is.na(x)) .....
. (Man kannlength(x)==0
anstelle von verwenden,is.null(x)
aber es ist nicht möglich,length(x)==0 | is.na(x)
wenn esx
istNULL
.)|
(vektorisiertes ODER, bei dem beide Seiten ausgewertet werden) anstelle von||
(Kurzschluss-ODER, nicht vektorisiert, bei dem Prädikate der Reihe nach ausgewertet werden) verwendet haben. Betrachten Sieif (TRUE | stop()) print(1)
versusif (TRUE || stop()) print(1)
return
kann die Lesbarkeit des Codes verbessern:quelle
foo <- function() a || b
(was IMO besser lesbar ist; auf jeden Fall gibt es keine "reine" Lesbarkeit, aber Lesbarkeit nach Meinung von jemandem: Es gibt Leute, die sagen, Assemblersprache ist perfekt lesbar)Das Argument der Redundanz ist hier viel aufgetaucht. Meiner Meinung nach ist das nicht Grund genug, es wegzulassen
return()
. Redundanz ist nicht automatisch eine schlechte Sache. Bei strategischer Verwendung macht Redundanz den Code klarer und wartbarer.Betrachten Sie dieses Beispiel: Funktionsparameter haben häufig Standardwerte. Die Angabe eines Werts, der dem Standardwert entspricht, ist daher redundant. Außer es macht das Verhalten deutlich, das ich erwarte. Sie müssen die Funktionsmanpage nicht aufrufen, um mich an die Standardeinstellungen zu erinnern. Und keine Sorge, dass eine zukünftige Version der Funktion ihre Standardeinstellungen ändert.
Mit einer vernachlässigbaren Leistungsstrafe für Anrufe
return()
(gemäß den hier von anderen veröffentlichten Benchmarks) kommt es eher auf den Stil als auf richtig und falsch an. Damit etwas "falsch" ist, muss es einen klaren Nachteil geben, und niemand hier hat zufriedenstellend gezeigt, dass das Einbeziehen oder Weglassenreturn()
einen konsequenten Nachteil hat. Es scheint sehr fallspezifisch und benutzerspezifisch zu sein.Hier stehe ich also dazu.
Ich fühle mich mit "verwaisten" Variablen wie im obigen Beispiel unwohl. Wurde
abcd
gehen Teil einer Anweisung, die ich nicht zu schreiben habe fertig? Ist es ein Rest eines Spleißes / einer Bearbeitung in meinem Code und muss gelöscht werden? Habe ich versehentlich etwas von einem anderen Ort eingefügt / verschoben?Im Gegensatz dazu macht mir dieses zweite Beispiel klar, dass es sich eher um einen beabsichtigten Rückgabewert als um einen Unfall oder unvollständigen Code handelt. Für mich ist diese Redundanz absolut nicht nutzlos.
Sobald die Funktion beendet ist und funktioniert, kann ich natürlich die Rückgabe entfernen. Aber es zu entfernen ist an sich ein überflüssiger zusätzlicher Schritt und meiner Ansicht nach nutzloser, als es überhaupt einzubeziehen
return()
.Alles in allem verwende ich keine
return()
kurzen unbenannten Einzeilerfunktionen. Dort macht es einen großen Teil des Funktionscodes aus und verursacht daher meistens visuelle Unordnung, die den Code weniger lesbar macht. Aber für größere formal definierte und benannte Funktionen verwende ich es und werde es wahrscheinlich auch weiterhin tun.quelle
return()
in R kostet nichts. Es ist objektiv überflüssig, aber "nutzlos" zu sein, ist Ihr subjektives Urteil. Redundant und nutzlos sind nicht unbedingt Synonyme. Hier sind wir uns nicht einig.return
, und obwohl ich nicht überzeugt bin, denke ich, dass es möglicherweise gültig ist (es ist definitiv in einer zwingenden Sprache… ich glaube, dass es nicht in funktionale Sprachen übersetzt wird).