2015-09-28 9 views
13

Scavando nel codice sorgente R (file R-3.2.2/src/main/gram.y linee 2836 a 2852) ho trovato che il parser R/tokenizer ritiene che := è un token LEFT_ASSIGNMENT.Qual è l'operatore di assegnazione R: = per?

Ma quando si cerca di utilizzare come un operatore di assegnazione in R.3.2.2,
ho un errore (impossibile trovare la funzione per := ...), ma come si può vedere R considera come un incarico come <-:

> myVar := 42 
Erreur : impossible de trouver la fonction ":=" 
> := 
Erreur : unexpected assignment in ":=" 
> <- 
Erreur : unexpected assignment in "<-" 

si tratta di un bug, o fa il il token := deve essere rimosso dal codice sorgente del tokenizer?

C'è una storia passata sull'operatore := in R?

+2

':' = è un operatore molto utile all'interno di 'data.table' ma non (ancora?) in R per quanto ne so. – daroczig

+2

Non correlato: perché metà dell'output dell'errore R è in inglese? Suppongo che tu abbia la locale impostata sul francese. –

+0

Correlati: http://stackoverflow.com/questions/7033106 http://stackoverflow.com/questions/26269423 – Frank

risposta

5

Per chiarire, gli operatori di assegnazione R sono <- e =.

per ottenere informazioni su di loro tipo:

?`<-` 

Invece di <- nella riga di comando. Esiste anche un operatore <<- che influenza la variabile nell'ambiente padre.

Riguardo a :=, questo operatore è l'operatore j nel pacchetto data.table. Può essere letto defined as ed è utilizzabile solo in un oggetto data.table. Per illustrare questo modifichiamo la seconda colonna di b (definire col2 con valore b) quando i valori del primo colle sono uguali a 1:

library(data.table) 

dt = data.table(col1=c(1,2,1,2,3), col2 = letters[1:5]) 

dt[col1==1,col2:='b'] 

Per una spiegazione dettagliata:

?`:=` 

Speri chiarisce.

+0

Immagino che quelle righe nel codice del parser siano il motivo per cui ': =' potrebbe essere definito. Ricordo di aver letto qualcosa del genere, ma ho dimenticato dove. Forse Matt o Arun potrebbero chiarire. – Roland

+0

In effetti i pacchetti data.table definiscono una funzione personalizzata ': =' che si avvantaggia dell'operatore di assegnazione ': =' definito nel parser/tokenizzatore R, ma non è descritto/scritto in modo non ufficiale da nessuna parte in R Language ... Next domanda: è davvero sicuro e a prova di futuro per tutti (e per i manutentori di data.table ...) usare questo ': =' token ??? Gli sviluppatori di data.table chiedono al team R team di aggiungere questo token di assegnazione ': ='? –

+0

@RomainJacotin È estremamente improbabile che R-core cambi il parser in un modo che interrompe il pacchetto data.table ampiamente utilizzato. Stanno molto attenti alla retrocompatibilità. – Roland

11

E 'stato un operatore di assegnazione precedentemente consentito, vedere this article da John Chambers nel 2001.

La versione di sviluppo di R consente ora alcune assegnazioni da scrivere C o in stile Java, usando l'operatore = . Ciò aumenta la compatibilità con S-Plus (così come con C, Java e molte altre lingue).

Tutti gli operatori di assegnamento in precedenza consentite (< -,: =, _, e < < -) restano pienamente in vigore.

Sembra la funzione := non è più presente, ma è possibile "riabilitarlo" come questo:

`:=` <- `<-` 
x:=3 
x 
[1] 3 
+0

Grazie James, è chiaro ora. –

+0

James, sembra che "_" al momento non sia visto come un compito dal parser/tokenizzatore R-3.2.2 (basta scriverlo da solo sul prompt e si avrà un "input inaspettato" e non un "assegnamento inaspettato" come avrai digitando da solo '<-' o ': =' o '<< -' –

+0

@RomainJacotin Sì, il trattino basso è stato rimosso come operatore di assegnazione nella versione 1.8.0, non trovo alcuna menzione nel file di notizie riguardanti ': =' però. http://svn.r-project.org/R/trunk/doc/NEWS.1 – James

Problemi correlati