2012-06-08 12 views
6

The manual estados:¿Por qué el operador "=" R no se debe usar en las funciones?

El operador '< -' se puede utilizar en cualquier lugar, mientras que el operador '=' sólo se permite en el nivel superior (por ejemplo, en la expresión completa se escriba en el símbolo del sistema) o como uno de las subexpresiones en una lista de expresiones arriostradas.

The question here mencionan la diferencia cuando se utilizan en la llamada a la función. Sin embargo, en la definición de función, parece que funciona normalmente:

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

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

Entonces, ¿el manual menciona que the operator ‘=’ is only allowed at the top level ??

No hay nada al respecto en el language definition (no hay = operador de la lista, qué pena!)

+0

Se menciona en R-lang en [sección 10.4.2 Infix y operadores de prefijos] (http://cran.r-project.org/doc/manuals/R-lang.html#Infix-and-prefix-operators), pero no dice mucho más de lo que está en la entrada de ayuda que mencionaste. –

+5

El texto que cita dice "en el nivel superior ** O ** en una lista corregida de subexpresiones". Lo está usando en una lista de subexpresiones preparadas. Lo cual está permitido. – Andrie

+5

Tienes que hacer grandes esfuerzos para encontrar una expresión que no sea ni a nivel ni entre llaves. Aqui hay uno. A veces quieres envolver una tarea dentro de un bloque 'try':' try (x <- f()) 'está bien, pero' try (x = f (x)) 'no lo es - necesitas cambiar el operador de asignación o agregar llaves. –

Respuesta

12

El texto que cita dice at the top level OR in a braced list of subexpressions. Lo está usando en una lista de subexpresiones preparadas. Lo cual está permitido.

Tienes que hacer grandes esfuerzos para encontrar una expresión que no sea ni de nivel ni entre llaves. Aqui hay uno. A veces, desea envolver una tarea dentro de un bloque try: try(x <- f()) está bien, pero try(x = f(x)) no lo está; necesita cambiar el operador de asignación o agregar llaves.

+0

Vincent, gracias, pero ¿cómo funciona esta respuesta? mi pregunta sobre 'b = 2' es incorrecta en mi ejemplo? Tal vez echo de menos algo entonces, por favor explícalo de manera más obvia :) – TMS

+0

@Tomas He agregado mi comentario que has encontrado útil.Creo que esto responde la pregunta. – Andrie

+0

Gracias Andrie, ¡genial! – TMS

7

Las expresiones no en el nivel superior incluyen el uso de estructuras de control como if. Por ejemplo, el siguiente error de programación es ilegal.

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

Como se ha mencionado aquí: https://stackoverflow.com/a/4831793/210673

Véase también http://developer.r-project.org/equalAssign.html

+0

gracias por el [segundo enlace] (http://developer.r-project.org/equalAssign.html)! La información más importante es: * "Donde está permitido, el operador' = 'es semánticamente equivalente a todas las asignaciones anteriores (es decir,' <-' y otros). "* – TMS

3

Aparte de algunos ejemplos como system.time, como otros han demostrado que <- y = tienen resultados diferentes, la diferencia principal es más filisófica. Larry Wall, el creador de Perl, dijo algo así como "cosas similares deben parecer similares, diferentes cosas deben verse diferentes", he encontrado interesante en diferentes idiomas para ver qué cosas se consideran "similares" y cuáles se consideran " diferente". Ahora para la asignación R vamos a comparar 2 comandos:

myfun(a <- 1:10) 

myfun(a = 1:10) 

Algunos podrían argumentar que en ambos casos le transferimos a 1:10a así que lo que estamos haciendo es similar.

El otro argumento es que en la primera convocatoria estamos asignando a una variable a que está en el mismo entorno de la que se está llamando myfun y en la segunda convocatoria estamos asignando a una variable a que está en el entorno creado cuando se llama a la función y es local para la función y esas dos variables a son diferentes.

Entonces, qué utilizar depende de si considera las asignaciones "similares" o "diferentes".

Personalmente, prefiero <-, pero no creo que valga la pena pelear una guerra santa.

Cuestiones relacionadas