Was sind die Unterschiede zwischen den Zuweisungsoperatoren =
y <-
in R?
Wie Ihr Beispiel zeigt, =
y <-
haben einen leicht unterschiedlichen Vorrang der Operatoren (was die Reihenfolge der Auswertung bestimmt, wenn sie im selben Ausdruck gemischt werden). In der Tat, ?Syntax
in R ergibt die folgende Tabelle mit der Rangfolge der Operatoren, vom höchsten zum niedrigsten:
…
‘-> ->>’ rightwards assignment
‘<- <<-’ assignment (right to left)
‘=’ assignment (right to left)
…
Aber ist das der einzige Unterschied?
Da Sie sich nach dem Zuweisungsoperatoren : Ja, das ist der einzige Unterschied. Es wäre jedoch verzeihlich, wenn Sie etwas anderes glaubten. Sogar die R-Dokumentation von ?assignOps
behauptet, dass es weitere Unterschiede gibt:
Der Betreiber <-
kann überall verwendet werden, während der Operator =
ist nur auf der obersten Ebene erlaubt (z.B., in dem vollständigen Ausdruck, der an der Eingabeaufforderung eingegeben wird) oder als einer der der Unterausdrücke in einer geschweiften Liste von Ausdrücken.
Wir wollen es nicht zu sehr auf die Spitze treiben: die R-Dokumentation ist falsch . Dies ist leicht zu zeigen: Wir müssen nur ein Gegenbeispiel für die =
Operator, der weder (a) auf der obersten Ebene noch (b) ein Unterausdruck in einer geschweiften Liste von Ausdrücken ist (d. h. {…; …}
). - Ohne weitere Umschweife:
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
Offensichtlich haben wir eine Zuweisung durchgeführt, indem wir =
außerhalb der Kontexte (a) und (b). Warum also ist die Dokumentation einer Kernfunktion der Sprache R seit Jahrzehnten falsch?
Das liegt daran, dass in der Syntax von R das Symbol =
hat zwei unterschiedliche Bedeutungen, die routinemäßig verwechselt werden (selbst von Experten, auch in der oben zitierten Dokumentation):
- Die erste Bedeutung ist die eines Zuweisungsoperator . Das ist alles, worüber wir bis jetzt gesprochen haben.
- Die zweite Bedeutung ist nicht ein Operator, sondern ein Syntax-Token die Signale Übergabe von benannten Argumenten in einem Funktionsaufruf. Anders als die
=
Betreiber er führt keine Aktion zur Laufzeit aus, sondern ändert lediglich die Art und Weise, wie ein Ausdruck geparst wird.
Wie entscheidet R also, ob eine bestimmte Verwendung von =
sich auf den Operator oder auf die Übergabe von benannten Argumenten bezieht? Schauen wir mal.
In jedem Stück Code der allgemeinen Form
‹function_name›(‹argname› = ‹value›, …)
‹function_name›(‹args›, ‹argname› = ‹value›, …)
die =
ist das Token, das die Übergabe von benannten Argumenten definiert: Es ist no der Zuweisungsoperator. Außerdem, =
ist vollständig Verbotene in einigen syntaktischen Kontexten:
if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …
Jede dieser Möglichkeiten führt zu einem Fehler "unerwartetes '=' in 'bla'".
In jedem anderen Zusammenhang, =
bezieht sich auf den Aufruf des Zuweisungsoperators. Insbesondere macht das bloße Setzen von Klammern um den Unterausdruck jeden der oben genannten (a) gültig und (b) einen Auftrag . Zum Beispiel führt die folgende Zuordnung:
median((x = 1 : 10))
Aber auch:
if (! (nf = length(from))) return()
Nun könnten Sie einwenden, dass ein solcher Code grässlich ist (und Sie mögen Recht haben). Aber ich habe diesen Code aus der <code>base::file.copy</code> Funktion (anstelle von <code><-</code> mit <code>=</code> ) - es ist ein allgegenwärtiges Muster in einem Großteil der R-Kern-Codebasis.
El Originalerklärung von John Chambers , auf dem die R-Dokumentation wahrscheinlich basiert, erklärt dies eigentlich korrekt:
[ =
Zuweisung ist] nur an zwei Stellen in der Grammatik erlaubt: auf der obersten Ebene (als vollständiges Programm oder benutzertypisierter Ausdruck); und wenn sie von der umgebenden logischen Struktur isoliert ist, durch geschweifte Klammern oder ein zusätzliches Paar Klammern.
Zusammenfassend lässt sich sagen, dass die Betreiber standardmäßig <-
y =
das Gleiche tun. Aber jeder von ihnen kann sein außer Kraft gesetzt getrennt, um sein Verhalten zu ändern. Im Gegensatz dazu, <-
y ->
(Links-nach-Rechts-Zuweisung), obwohl syntaktisch unterschiedlich, rufen immer die même Funktion. Das Überschreiben einer Funktion setzt auch die andere außer Kraft. Dies zu wissen, ist selten praktisch aber es peut für einige lustige Spielereien verwendet werden .
68 Stimmen
Wie bereits erwähnt aquí die Ursprünge der
<-
Symbol stammt von alten APL-Tastaturen, die eigentlich nur ein<-
Taste auf sie.