2014-10-09 9 views
19

Mi sono imbattuto nel popolare pacchetto data.table e una cosa in particolare mi ha incuriosito. Ha una sul posto operatore di assegnamentoPerché: = consentito come operatore infisso?

:=

Questo non è definita in R. Base Infatti se non si carica il pacchetto data.table, sarebbe sollevato un errore se si fosse trovato a usato (ad esempio , a := 2) con il messaggio:

Error: could not find function ":="

Inoltre, perché fa := lavoro? Perché R consente di definire := come operatore infisso mentre ogni altra funzione infisso deve essere circondata da %%, ad es.

`:=` <- function(a, b) { 
    paste(a,b) 
} 

"abc" := "def" 

Chiaramente non è destinata ad essere una sintassi alternativa per %function.name% per definire le funzioni infissa. data.table sta sfruttando alcune stranezze di parsing di R? È un hack? Sarà "rattoppato" in futuro?

+5

Si prega di dare un'occhiata alla documentazione data.table, a partire forse con le FAQ. –

+1

@DirkEddelbuettel. Capisco come è usato in data.table. Ma il fatto che R consenta che un tale operatore sia definito e non causa un errore di sintassi è ciò che mi ha intrigato. È una domanda fondamentale su R e forse su come analizza il codice. – xiaodai

+2

AFAIK è locale a data.table e funziona solo con il '[' subsettings. Quindi la tua domanda è off-base (non una stranezza R) ed è per questo che ti ho mandato ai documenti data.table * che discutono di questo *. –

risposta

29

È qualcosa che il parser di base R riconosce e sembra analizzare come un sinistro assegnato (almeno in termini o ordine di operazioni e tale). Vedere lo C source code per ulteriori dettagli.

as.list(parse(text="a:=3")[[1]]) 
# [[1]] 
# `:=` 
# 
# [[2]] 
# a 
# 
# [[3]] 
# [1] 3 

Per quanto posso dire è non documentato (per quanto riguarda la base R è interessato). Ma si tratta di una funzione/operatore è possibile modificare il comportamento di

`:=`<-function(a,b) {a+b} 
3 := 7 
# [1] 10 

Come si può vedere non c'è davvero niente di speciale sulla ":" una parte per sé. Capita solo di essere l'inizio di un token composto.

+0

Eww. Non pensare che sia una buona idea. È documentato: '? ': ='' Richiama una pagina di aiuto se pkg: data.table è caricato. –

+12

@BondedDust Ma 'data.table' non * possiede * quella funzione. Stanno davvero facendo affidamento su qualcosa che giace nel parser su cui non hanno alcun controllo. Un altro pacchetto potrebbe ridefinire 'c' se gli piace. Questo è essenzialmente ciò che stanno facendo (non ci sono implementazioni predefinite per ': =') – MrFlick

+1

L'OP ha menzionato il pacchetto data.table, quindi direi che in quell'impostazione ': =' è "proprietà" dei dati. tavolo.Suppongo che sarei d'accordo con te se tu sostenessi che la funzione periodo ('.()') Ha una "proprietà" separata (localizzata) dalle funzioni 'bquote' e plyr. E a mio avviso, ridefinire 'c()' è anche una pessima idea. –

6

Non è solo un operatore di due punti, ma piuttosto := è un operatore singolo formato dai due punti e segno di uguale (proprio come la combinazione di "<" e "-" costituisce l'operatore di assegnazione nella base R). L'operatore := è una funzione infisso definita come parte della valutazione dell'argomento "j" all'interno della funzione [.data.table. Crea o assegna un valore a una colonna designata dal suo argomento LHS utilizzando il risultato della valutazione del suo RHS.

+3

Per i downvoters che non stanno spiegando le loro preoccupazioni. Questa risposta è stata scritta per rispondere alla domanda come originariamente scritta. Puoi vedere il titolo e il contenuto originali facendo clic sul link "modificato ....". –

Problemi correlati