Was sind die Unterschiede zwischen "=" und "<-" in R?

Was sind die Unterschiede zwischen Zuweisungsoperatoren = und <- in R?

Ich weiß, dass sich die Operatoren etwas unterscheiden, wie dieses Beispiel zeigt.

 x <- y <- 5 x = y = 5 x = y <- 5 x <- y = 5 # Error in (x <- y) = 5 : could not find function "<-<-" 

Aber ist das der einzige Unterschied?

541
16 нояб. eingestellt von csgillespie 16 nov. 2009-11-16 15:14 09 um 15:14 2009-11-16 15:14
Quelle zu teilen
@ 7 Antworten

Der Unterschied in Zuweisungsanweisungen wird deutlicher, wenn Sie mit ihnen den Wert eines Arguments in einem Funktionsaufruf festlegen. Zum Beispiel:

 median(x = 1:10) x ## Error: object 'x' not found 

In diesem Fall wird x im Gültigkeitsbereich der Funktion deklariert, sodass es im Arbeitsbereich des Benutzers nicht vorhanden ist.

 median(x <- 1:10) x ## [1] 1 2 3 4 5 6 7 8 9 10 

In diesem Fall wird x im Arbeitsbereich des Benutzers deklariert, so dass Sie es nach Abschluss des Funktionsaufrufs verwenden können.


In der R-Community wird allgemein die Verwendung von <- für die Zuweisung (außer Funktionssignaturen) zur Kompatibilität mit (sehr) älteren Versionen von S-Plus verwendet. Beachten Sie, dass Leerzeichen helfen, Situationen wie z

 x<-3 # Does this mean assignment? x <- 3 # Or less than? x < -3 

Die meisten R IDEs haben Tastenkombinationen, um die <- vereinfachen. Strg + = im Architekten, Alt + - in RStudio ( Option + - unter macOS), Shift + - (Unterstrich) in emacs + ESS.


Wenn Sie lieber = to <- schreiben möchten, aber ein allgemeineres Zuweisungssymbol für einen gemeinsam genutzten Code verwenden möchten (z. B. CRAN), können Sie eine der tidy_* -Funktionen im formatR Paket für die automatische Ersetzung verwenden = using <- ,

 library(formatR) tidy_source(text = "x=1:5", arrow = TRUE) ## x <- 1:5 

Die Antwort auf die Frage "Warum gibt x <- y <- 5 x <- y = 5 einen Fehler ab, aber nicht x <- y <- 5 ?" "Dies hängt von der im Parser enthaltenen Magie ab." Die R-Syntax enthält viele mehrdeutige Fälle , die auf die eine oder andere Weise gelöst werden müssen. Der Parser entscheidet sich dafür, die Ausdrucksbits in unterschiedlicher Reihenfolge aufzulösen, je nachdem, ob = oder <- .

Um zu verstehen, was passiert, müssen Sie wissen, dass die Zuweisung den zugewiesenen Wert automatisch zurückgibt. Sie können es deutlicher sehen, indem Sie explizit zB print(x <- 2 + 3) eingeben.

Zweitens ist es klarer, wenn wir für die Zuweisung die Präfixnotation verwenden. So

 x <- 5 '<-'(x, 5) #same thing y = 5 '='(y, 5) #also the same thing 

Der Parser interpretiert x <- y <- 5 als

 '<-'(x, '<-'(y, 5)) 

Wir können erwarten, dass x <- y = 5 ist

 '<-'(x, '='(y, 5)) 

aber eigentlich interpretiert als

 '='('<-'(x, y), 5) 

Dies ist darauf zurückzuführen, dass = weniger Priorität als <- , wie auf der Hilfeseite ?Syntax angezeigt.

525
16 нояб. Die Antwort wird von Richie Cotton am 16. November gegeben. 2009-11-16 17:36 09 um 17:36 2009-11-16 17:36
Quelle zu

Der Google R-Style-Guide vereinfacht dieses Problem, indem er die Zuweisung von "=" verbietet. Keine schlechte Wahl.

https://google.github.io/styleguide/Rguide.xml

Das Handbuch R enthält detaillierte Informationen zu allen 5 Zuweisungsoperatoren.

http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html

87
16 нояб. Die Antwort wird von Nosredna am 16. November gegeben. 2009-11-16 17:44 09 um 17:44 2009-11-16 17:44
Quelle zu

Laut John Chambers ist der Operator = nur auf der "obersten Ebene" zulässig, was bedeutet, dass er in Kontrollstrukturen wie if nicht zulässig if , was den folgenden Programmierfehler unzulässig macht.

 > if(x = 0) 1 else x Error: syntax error 

Er schreibt: "Durch das Verbot einer neuen Zuweisungsform [=] in Steuerungsausdrücken können Sie Programmierfehler (z. B. das obige Beispiel) vermeiden, die bei einem gleichwertigen Operator wahrscheinlicher sind als bei anderen S-Zuweisungen."

Sie können dies tun, wenn es „von der umgebenden logischen Struktur, durch Klammern oder durch ein zusätzliches Klammerpaar isoliert ist“. if ((x = 0)) 1 else x dann funktioniert if ((x = 0)) 1 else x .

Siehe http://developer.r-project.org/equalAssign.html

28
28 янв. Antworten Aaron 28. Januar 2011-01-28 21:34 '11 um 21:34 2011-01-28 21:34
Quelle zu

x = y = 5 äquivalent zu x = (y = 5) , da die Zuweisungsoperatoren von rechts nach links "gruppiert" werden, was funktioniert. Wert: Weisen Sie 5 zu y , wobei Sie die Zahl 5 belassen. und weisen Sie dann diesen Wert 5 auf x .

Dies ist nicht dasselbe wie (x = y) = 5 , was nicht funktioniert! Wert: Legen Sie den Wert von y x und belassen Sie den Wert von y . und dann 5 mmmm zuweisen ... was genau?

Wenn Sie verschiedene Arten von Zuweisungsanweisungen mischen, ist <- binder starrer als = . Also wird x = y <- 5 als x = (y <- 5) interpretiert, was Sinn macht.

Leider wird x <- y = 5 als (x <- y) = 5 interpretiert, was nicht funktioniert!

Siehe " ?Syntax und" ?assignOps für ?assignOps Priorität ( ?assignOps ) und Gruppierung.

26
10 сент. Die Antwort wird von Steve Pitchers am 10. September gegeben 2014-09-10 00:21 '14 am 0:21 2014-09-10 00:21
Quelle zu

Die Operatoren <- und = <- der Umgebung zugeordnet, in der sie berechnet werden. Der Operator <- kann an einer beliebigen Stelle verwendet werden, während der Operator = nur auf der obersten Ebene zulässig = (z. B. in dem in der Befehlszeile eingegebenen vollständigen Ausdruck) oder als einer der Unterausdrücke in den Klammern für die Liste der Ausdrücke.

20
16 нояб. Die Antwort wird von Haim Evgi am 16. November gegeben. 2009-11-16 15:21 09 um 15:21 2009-11-16 15:21
Quelle zu

Was sind die Unterschiede zwischen Zuweisungsoperatoren = und <- in R?

Wie Ihr Beispiel zeigt, haben = und <- eine etwas andere Operatorpriorität (die die Reihenfolge der Auswertung bestimmt, wenn sie in demselben Ausdruck gemischt werden). Tatsächlich gibt die ?Syntax in R die folgende Operatorprioritätstabelle an: von der höchsten zur niedrigsten:

 … '-> ->> rightwards assignment '<- <<- assignment (right to left) '= assignment (right to left) … 

Aber ist das der einzige Unterschied?

Da Sie nach Zuweisungsoperatoren gefragt haben: Ja, das ist der einzige Unterschied. Ihnen wird jedoch der Glaube verweigert. Sogar R-Dokumentation ?assignOps behauptet, dass es noch mehr Unterschiede gibt:

Der Operator <- kann an einer beliebigen Stelle verwendet werden, während der Operator = nur auf der obersten Ebene zulässig = (z. B. in dem in der Befehlszeile eingegebenen vollständigen Ausdruck) oder als einer der Unterausdrücke in den Klammern für die Liste der Ausdrücke.

Machen Sie keinen zu dünnen Punkt: Die Dokumentation R (subtil) ist fehlerhaft [ 1 ] . Das ist einfach zu zeigen: Wir müssen nur ein Gegenbeispiel für den Operator = der nicht (a) auf der obersten Ebene ist, und (b) den Unterausdruck in den Klammern der Liste der Ausdrücke (dh {…; …} ) finden. - Ohne weiteres:

 x # Error: object 'x' not found sum((x = 1), 2) # [1] 3 x # [1] 1 

Offensichtlich haben wir die Zuordnung mit = aus Kontexten (a) und (b) durchgeführt. Warum ist die Dokumentation der Schlüsselsprachfunktion R seit Jahrzehnten falsch?

Dies liegt daran, dass in der Rs-Syntax das Symbol = zwei verschiedene Bedeutungen hat, die normalerweise kombiniert werden:

  1. Der erste Wert ist der Zuweisungsoperator. Dies ist immer noch alles gesagt.
  2. Der zweite Wert ist kein Operator, sondern ein syntaktisches Token, das das im Funktionsaufruf übergebene benannte Argument übergibt. Im Gegensatz zum Operator = führt es zur Laufzeit keine Aktion aus, sondern ändert lediglich die Art und Weise, in der der Ausdruck analysiert wird.

Wir werden sehen.

In einem beliebigen Codeausschnitt der allgemeinen Form ...

 ‹function_name› ( ‹argname› = ‹value› , …) ‹function_name› ( ‹args› , ‹argname› = ‹value› , …) 

... das = ist ein Token, das die Übertragung benannter Argumente definiert: Es ist kein Zuweisungsoperator. Darüber hinaus = in einigen syntaktischen Kontexten völlig verboten:

 if ( ‹var› = ‹value› ) … while ( ‹var› = ‹value› ) … for ( ‹var› = ‹value› in ‹value2› ) … for ( ‹var1› in ‹var2› = ‹value› ) … 

Jeder dieser Fälle führt zu einem "unerwarteten" = "Fehler in <bla>".

In jedem anderen Kontext bezieht sich = auf das Aufrufen eines Zuweisungsoperators. Insbesondere das einfache Platzieren der Klammern um den Teilausdruck macht einen der obigen Punkte (a) gültig und (b) die Zuordnung. Beispielsweise führt Folgendes die Zuordnung aus:

 median((x = 1 : 10)) 

Aber auch:

 if (! (nf = length(from))) return() 

Jetzt können Sie argumentieren, dass ein solcher Code grausam ist (und Sie haben möglicherweise Recht). Ich habe diesen Code jedoch aus der Funktion base::file.copy (ersetzt durch <- with = ) - seiner allgegenwärtigen Struktur auf den meisten base::file.copy von R.

Die erste Erklärung von John Chambers , die wahrscheinlich auf der R-Dokumentation beruht, erklärt dies richtig:

[ = Zuweisung] ist in der Grammatik nur an zwei Stellen erlaubt: auf oberster Ebene (als komplettes Programm oder als benutzerdefinierter Ausdruck); und von der umgebenden logischen Struktur durch Klammern oder ein zusätzliches Klammerpaar isoliert.


Geständnis: Ich habe vorher gelogen. Es gibt noch einen weiteren Unterschied zwischen den Operatoren = und <- : Sie verursachen unterschiedliche Funktionen. Standardmäßig machen diese Funktionen dasselbe, aber Sie können jede davon separat neu definieren, um das Verhalten zu ändern. Im Gegensatz dazu rufen <- und -> (von links nach rechts), obwohl sie sich syntaktisch unterscheiden, immer dieselbe Funktion auf. Das Überschreiben eines überschreibt auch das andere. Das zu wissen, ist selten praktisch, aber es kann für lustige Machenschaften verwendet werden .

12
27 июля '18 в 22:17 2018-07-27 22:17 Die Antwort gibt Konrad Rudolph am 27. Juli 1818 um 22:17 Uhr. 2018-07-27 22:17
Quelle zu

Es kann auch zum Verständnis des Unterschieds zwischen diesen beiden Operatoren beitragen:

 df <- data.frame( a = rnorm(10), b <- rnorm(10) ) 

Für das erste Element R werden Werte und ein richtiger Name zugewiesen, und der Name des zweiten Elements sieht etwas seltsam aus.

 str(df) # 'data.frame': 10 obs. of 2 variables: # $ a : num 0.6393 1.125 -1.2514 0.0729 -1.3292 ... # $ b....rnorm.10.: num 0.2485 0.0391 -1.6532 -0.3366 1.1951 ... 

R-Version 3.3.2 (2016-10-31); macOS Sierra 10.12.1

4
11 дек. Die Antwort gibt Denis Rasulev 11 Dez. 2016-12-11 00:32 '16 am 0:32 2016-12-11 00:32
Quelle zu

Weitere Fragen zum für Tags oder Frage stellen