La differenza in assignment operators è più chiara quando li si utilizza per impostare un valore argomento in una chiamata di funzione. Ad esempio:
median(x = 1:10)
x
## Error: object 'x' not found
In questo caso, x
viene dichiarata nell'ambito della funzione, quindi non esiste nell'area di lavoro dell'utente.
median(x <- 1:10)
x
## [1] 1 2 3 4 5 6 7 8 9 10
In questo caso, x
viene dichiarata nello spazio di lavoro dell'utente, in modo da poter utilizzare dopo la chiamata di funzione è stata completata.
C'è una preferenza generale tra la comunità R per l'utilizzo di <-
per l'assegnazione (se non in funzione di firme) per la compatibilità con (molto) le vecchie versioni di S-Plus. Si noti che gli spazi contribuiscono a chiarire situazioni come
x<-3
# Does this mean assignment?
x <- 3
# Or less than?
x < -3
maggior R IDE hanno scorciatoie da tastiera per rendere <-
più facile da digitare. Ctrl += in Architect, Alt +- in RStudio (Opzione + - sotto MacOS), Maiusc +- (sottolineatura) in emacs + ESS.
Se preferite scrivendo =
a <-
ma si desidera utilizzare il simbolo di assegnazione più comune per il codice rilasciato pubblicamente (il CRAN, per esempio), allora si può utilizzare una delle tidy_*
funzioni nel pacchetto formatR
automaticamente sostituire =
con <-
.
library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5
La risposta alla domanda "Perché x <- y = 5
genera un errore, ma non x <- y <- 5
?" è "È la magia contenuta nel parser". La sintassi di R contiene many ambiguous cases che devono essere risolti in un modo o nell'altro.Il parser sceglie di risolvere i bit dell'espressione in ordini diversi a seconda che sia stato utilizzato =
o <-
.
Per capire cosa sta succedendo, è necessario sapere che l'assegnazione restituisce silenziosamente il valore assegnato. Lo si può vedere più chiaramente stampando esplicitamente, ad esempio print(x <- 2 + 3)
.
In secondo luogo, è più chiaro se si utilizza la notazione del prefisso per l'assegnazione. Così
x <- 5
`<-`(x, 5) #same thing
y = 5
`=`(y, 5) #also the same thing
Il parser interpreta x <- y <- 5
come
`<-`(x, `<-`(y, 5))
ci si potrebbe aspettare che x <- y = 5
sarebbe allora
`<-`(x, `=`(y, 5))
ma in realtà si arriva interpretato come
`=`(`<-`(x, y), 5)
Questo perché =
ha precedenza inferiore rispetto a <-
, come mostrato nella pagina di guida ?Syntax
.
Come indicato [qui] (http://blog.revolutionanalytics.com/2008/12/use-equals-or-arrow-for-assignment.html) le origini del '<-' il simbolo proviene dalle vecchie tastiere APL che in realtà avevano una sola chiave '<-' su di esse. – joran