2012-06-08 11 views
6

The manual Zustände:Warum sollte der "=" R-Operator nicht in Funktionen verwendet werden?

Der Operator ‚< -‘ kann überall eingesetzt werden, während des Operators ‚=‘ nur auf der obersten Ebene erlaubt sind (zB im vollständigen Ausdruck an der Eingabeaufforderung eingegeben) oder als eine der Teilausdrücke in einer Klammerliste von Ausdrücken.

The question here Erwähnen Sie den Unterschied, wenn Sie im Funktionsaufruf verwendet werden. Aber in der Funktionsdefinition, so scheint es normal zu arbeiten:

a = function() 
{ 
    b = 2 
    x <- 3 
    y <<- 4 
} 

a() 
# (b and x are undefined here) 

Warum das Handbuch, dass the operator ‘=’ is only allowed at the top level erwähnt ??

Es gibt nichts darüber in den language definition (es gibt keine = Betreiber aufgeführt, was für eine Schande!)

+0

Es ist in R-lang in [Abschnitt 10.4.2 Infix und Präfix-Operatoren] (http://cran.r-project.org/doc/manuals/R-lang.html#Infix-and-prefix-operators) erwähnt), aber sagt nicht viel mehr als das, was in dem Hilfeeintrag ist, den Sie erwähnten. –

+5

Der Text, den Sie angeben, sagt "auf der obersten Ebene ** ODER ** in einer geschweiften Liste von Unterausdrücken". Sie verwenden es in einer abgestuften Liste von Teilausdrücken. Was ist erlaubt. – Andrie

+5

Sie müssen sehr lange suchen, um einen Ausdruck zu finden, der weder in der obersten Ebene noch in Klammern steht. Hier ist eine. Manchmal möchten Sie eine Zuweisung in einen 'try'-Block schreiben:' try (x <- f()) 'ist in Ordnung, aber' try (x = f (x)) 'ist nicht - Sie müssen entweder die Option ändern Zuweisungsoperator oder Klammern hinzufügen. –

Antwort

12

Der Text sagt at the top level OR in a braced list of subexpressions zitieren sehen. Sie verwenden es in einer abgestuften Liste von Teilausdrücken. Was ist erlaubt.

Sie müssen sehr lange suchen, um einen Ausdruck zu finden, der weder in der obersten Ebene noch in Klammern steht. Hier ist eine. Manchmal möchten Sie eine Zuweisung in einen try-Block schreiben: try(x <- f()) ist in Ordnung, aber try(x = f(x)) ist nicht - Sie müssen entweder den Zuweisungsoperator ändern oder geschweifte Klammern hinzufügen.

+0

Vincent, danke, aber wie beantwortet sich das? meine Frage zu 'b = 2 'ist in meinem Beispiel falsch? Vielleicht verpasse ich etwas, also bitte erklären Sie es auf offensichtliche Weise :) – TMS

+0

@Tomas Ich habe meinen Kommentar hinzugefügt, den Sie hilfreich fanden.Ich denke, das beantwortet die Frage. – Andrie

+0

Danke Andrie, großartig! – TMS

7

Ausdrücke nicht auf der obersten Ebene umfasst den Einsatz in Kontrollstrukturen wie if. Zum Beispiel ist der folgende Programmierfehler illegal.

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

Wie hier erwähnt: https://stackoverflow.com/a/4831793/210673

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

+0

danke für den [zweiten Link] (http://developer.r-project.org/equalAssign.html)! Die wichtigste Information dort ist: * "Wo es erlaubt ist, ist der' = 'Operator semantisch äquivalent zu allen früheren Zuweisungen (dh' <-' und andere). "* – TMS

3

Andere als einige Beispiele wie system.time wie andere gezeigt haben, wo <- und = unterschiedliche Ergebnisse haben, ist der Hauptunterschied mehr philisophisch. Larry Wall, der Schöpfer von Perl, sagte etwas im Sinne von "ähnliche Dinge sollten ähnlich aussehen, verschiedene Dinge sollten anders aussehen", ich habe es in verschiedenen Sprachen interessant gefunden, um zu sehen, welche Dinge als "ähnlich" angesehen werden und welche betrachtet werden " anders". Jetzt für R Zuweisung wir 2 Befehle vergleichen:

myfun(a <- 1:10) 

myfun(a = 1:10) 

Einige dass in beiden Fällen argumentieren würden wir 1:10 zu a so zuweisen, was wir tun ähnlich ist.

Das andere Argument ist, dass in dem ersten Aufruf uns auf eine Variable a zuweisen, die in der gleichen Umgebung ist, von der myfun genannt wird, und in dem zweiten Aufruf uns auf eine Variable a zuweisen, die in der Umwelt geschaffen wenn die Funktion aufgerufen wird und für die Funktion lokal ist, sind diese beiden Variablen unterschiedlich.

Was zu verwenden ist hängt davon ab, ob Sie die Zuweisungen "ähnlich" oder "anders" betrachten.

Persönlich bevorzuge ich <-, aber ich denke nicht, dass es sich lohnt, einen heiligen Krieg über zu kämpfen.

Verwandte Themen