Was sind die Unterschiede zwischen den Zuweisungsoperatoren =
und <-
in R?
Als Ihr Beispiel zeigt, =
und <-
etwas anderen Operator Vorrang hat (was die Reihenfolge der Auswertung bestimmt , wann sie in dem gleichen Ausdruck gemischt werden). Tatsächlich gibt ?Syntax
in R die folgende Operator-Prioritätstabelle vom höchsten zum niedrigsten an:
…
‘-> ->>’ rightwards assignment
‘<- <<-’ assignment (right to left)
‘=’ assignment (right to left)
…
Aber ist das der einzige Unterschied?
Da Sie nach den Zuweisungsoperatoren gefragt haben : Ja, das ist der einzige Unterschied. Es wird Ihnen jedoch vergeben, wenn Sie etwas anderes glauben. Sogar die R-Dokumentation von ?assignOps
Behauptungen, dass es mehr Unterschiede gibt:
Der Operator <-
kann überall verwendet werden, während der Operator =
nur auf der obersten Ebene (z. B. in dem an der Eingabeaufforderung eingegebenen vollständigen Ausdruck) oder als einer der Unterausdrücke in einer geschweiften Liste von Ausdrücken zulässig ist.
Lassen Sie uns nicht zu genau darauf eingehen: Die R-Dokumentation ist (subtil) falsch [ 1 ] . Dies ist leicht zu zeigen: Wir müssen nur ein Gegenbeispiel für den =
Operator finden, das sich nicht (a) auf der obersten Ebene befindet, noch (b) einen Unterausdruck in einer geschweiften Liste von Ausdrücken (dh {…; …}
). - Ohne weiteres:
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
Natürlich haben wir eine Aufgabe =
außerhalb der Kontexte (a) und (b) durchgeführt. Warum ist die Dokumentation eines Kernmerkmals der R-Sprache seit Jahrzehnten falsch?
=
Dies liegt daran, dass das Symbol in Rs Syntax zwei unterschiedliche Bedeutungen hat, die routinemäßig zusammengeführt werden:
- Die erste Bedeutung ist als Zuweisungsoperator . Das ist alles, worüber wir bisher gesprochen haben.
- Die zweite Bedeutung ist kein Operator, sondern ein Syntax-Token , das das Übergeben eines benannten Arguments in einem Funktionsaufruf signalisiert . Im Gegensatz zum
=
Operator, der zur Laufzeit keine Aktion ausführt, ändert er lediglich die Art und Weise, wie ein Ausdruck analysiert wird.
Wir werden sehen.
In jedem Code der allgemeinen Form…
‹function_name›(‹argname› = ‹value›, …)
‹function_name›(‹args›, ‹argname› = ‹value›, …)
… Das =
ist das Token, das die Übergabe benannter Argumente definiert: Es ist nicht der Zuweisungsoperator. Darüber hinaus =
ist in einigen syntaktischen Kontexten völlig verboten :
if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …
Jedes dieser Ereignisse löst den Fehler "unerwartet '=' in ‹bla›" aus.
=
Bezieht sich in jedem anderen Kontext auf den Aufruf des Zuweisungsoperators. Insbesondere das bloße Setzen von Klammern um den Unterausdruck macht eine der oben genannten (a) und (b) eine Zuweisung gültig . Zum Beispiel führt das Folgende eine Zuweisung durch:
median((x = 1 : 10))
Aber auch:
if (! (nf = length(from))) return()
Jetzt könnten Sie einwenden, dass ein solcher Code grausam ist (und Sie könnten Recht haben). Aber ich nahm diesen Code aus der base::file.copy
Funktion (ersetzt <-
mit=
) - es ist ein durchdringendes Muster in weiten Teilen der Kern R - Codebasis.
Die ursprüngliche Erklärung von John Chambers , auf der die R-Dokumentation wahrscheinlich basiert, erklärt dies tatsächlich richtig:
[ =
Zuweisung ist] nur an zwei Stellen in der Grammatik zulässig: auf der obersten Ebene (als vollständiges Programm oder vom Benutzer eingegebener Ausdruck); und wenn von der umgebenden logischen Struktur isoliert, durch Klammern oder ein zusätzliches Paar Klammern.
Ein Geständnis: Ich habe früher gelogen. Es gibt einen zusätzlichen Unterschied zwischen den Operatoren =
und <-
: Sie rufen unterschiedliche Funktionen auf. Standardmäßig machen diese Funktionen dasselbe, aber Sie können beide separat überschreiben, um das Verhalten zu ändern. Im Gegensatz dazu rufen <-
und ->
(Zuordnung von links nach rechts), obwohl syntaktisch unterschiedlich, immer dieselbe Funktion auf. Das Überschreiben eines überschreibt auch das andere. Das zu wissen ist selten praktisch , kann aber für ein paar lustige Spielereien verwendet werden .
<-
Symbols von alten APL-Tastaturen, auf denen sich tatsächlich eine einzige<-
Taste befand.