Zuweisung in R: <- oder =

Zuweisungen in R werden üblicherweise mit dem Zuweisungs-Operator <- ausgeführt:

a <- 3
a
[1] 3

Manchen Anwendern mag das Gleichheitszeichen vertrauter sein – es funktioniert ebenfalls:

a = 4
a
[1] 4

Parameter-Übergabe mit Gleichheitszeichen: na.rm = TRUE

Bis vor kurzem dachte ich noch, der Zuweisungspfeil wäre eben üblich in R – konnte aber nicht sagen, inwiefern sich seine Funktion vom Gleichzeitszeichen unterscheidet.

Bei Funktionsaufrufen werden Parameter mit dem Gleichheitszeichen übergeben, etwa so:

mean(a, na.rm = TRUE)

Hier teilen wir R mit, dass etwaige Fehlwerte im Vektor a ignoriert werden sollen, sodass der Mittelwert aus den gültigen Werten errechnet wird.  Damit wird die strenge Voreinstellung (na.rm = FALSE) überschrieben, bei der R einen Fehlwert als Ergebnis liefert, sobald auch nur ein Fehlwert in a vorliegt.

Gibt es Situationen, in denen sich diese beiden Möglichkeiten (<- und =) unterscheiden?

Tatsächlich gibt es Situationen, in denen der Zuweisungspfeil funktioniert, das Gleichheitszeichen aber nicht:

wurzel <- function(n) sqrt(1:n)
system.time(result <- wurzel(5e6))
       User      System verstrichen 
       0.03        0.03        0.06

Zunächst definieren wir die Funktion wurzel, die für alle Zahlen von 1 bis n die Wurzel errechnet, wobei n im Funktionsaufruf anzugeben ist.

In diesem Beispiel wird ein Objekt „result“ gebildet, das die Wurzel der Zahlen von 1 bis 5 Millionen enthält (5e6 = 5 000 000). Dazu wird der Zeitbedarf ermittelt.

Hier scheitert die Variante mit dem Gleichheitszeichen:

system.time(result = wurzel(5e6))
Error in system.time(result = wurzel(5e+06)) : 
  unused argument (result = wurzel(5e+06))

Warum ist das so? Hier wird das Gleichheitszeichen als Kennzeichen einer Parameter-Übergabe aufgefasst. Die system.time-Funktion kennt jedoch keinen Parameter namens result. Beim Zuweisungspfeil im oberen Beispiel versteht R hingegen, dass result kein Parameter ist, sondern ein neu zu bildendes Objekt.

Ergo: Es ist sinnvoll, Zuweisungspfeile und Gleichheitszeichen auseinander zu halten.

Freue mich über Kommentare!