2014-07-11 12 views
8

In R sono consentiti gli operatori definiti dall'utente, ma sembra che solo gli operatori come % % siano accettati. È possibile aggirare questa restrizione per definire operatori come, ad esempio, >> o qualcosa che non è come % %?È possibile definire un operatore senza %%?

L'operatore deve essere un operatore reale in modo da poterlo utilizzare come 1 >> 2 e non è necessario utilizzarlo come ">>"(1,2).

+1

Anche se avete fatto uso '' >> come operatore, è può solo accedervi usando le virgolette o i backtick. E anche allora, raramente in un modo conveniente. Esempio: '\' >> \ '<- \'+\'; ">>" (4, 2) ' – A5C1D2H2I1M1N2O1R2T1

+0

Sì: vedere' sos :: ??? 'o' cgwtools :: splatnd' per esempi, ma prestare attenzione a tutti gli avvisi forniti in le risposte e i commenti: –

risposta

4

È possibile eseguire operazioni come questa, ma è possibile assegnare questi oggetti a un nuovo ambiente per sicurezza.

> "^" <- function(x, y) `-`(x, y) ## subtract y from x 
> 5^3 
# [1] 2 

> "?" <- function(x, y) sum(x, y) ## add x and y 
> 5 ? 5 
# [1] 10 
+5

Questi funzionano solo perché si sta riassegnando un operatore in uscita (ad esempio, '^' è per l'utilizzo dell'esponenziazione e '? 'è di aiuto). Se si tenta di utilizzare un diverso set di simboli come' << ' il parser non capirà e genererà un errore Probabilmente non è una buona idea riassegnare in caso altre funzioni si basino sulle loro definizioni standard – MrFlick

+1

@MrFlick Anche se questo è un avvertimento importante, vedi la mia risposta per un modo per ignorare attentamente gli operatori, che funziona attorno a questa restrizione –

+1

Si potrebbe anche assegnarlo a un ambiente diverso, giusto? Il proprio ambiente. –

12

No. R consente solo di

  1. Ridefinire operatori esistenti (come + o, addirittura <-),
  2. definire nuovi operatori infissi e racchiusi in %…%.

Queste sono le regole che dobbiamo giocare. Tuttavia, all'interno di queste regole tutto è giusto e giochi. Per esempio, siamo in grado di ridefinire + per stringhe di caratteri per eseguire la concatenazione, senza distruggere il suo significato normale (aggiunta):

> `+` 
function (e1, e2) .Primitive("+") 

Questa è la vecchia definizione, che vogliamo preservare per i numeri:

> `+.default` = .Primitive('+') 
> `+.character` = paste0 
> `+` = function (e1, e2) UseMethod('+') 
> 1 + 2 
[1] 3 
> 'hello' + 'world' 
[1] "helloworld" 

Questo sfrutta il sistema di classe S3 in R per rendere + generico sul tipo del suo primo argomento.

L'elenco di operatori che possono essere ridefiniti è piuttosto eclettico. Al primo conteggio, contiene i seguenti operatori:

+, -, *, /, ^, **, &, |, :, ::, :::, $, $<-, =, <-, <<-, == , <, <=, >, >=, !=, ~, &&, ||, !, ?, ??, @, @<-

(Tratto da modules source code.)

Inoltre, è possibile ignorare -> ridefinendo <-.Questo mi sembra che sarebbe raramente senso - ma almeno un buon esempio di ciò esiste, per definire lambda meno verbose:

> sapply(1 : 4, x -> 2 * x) 
[1] 2 4 6 8 

Implementation as a gist

Problemi correlati