2014-12-16 12 views
11

Supponiamo che io sono un programmatore pigro con le cattive abitudini (che è anche non sapere di plyr/dplyr), mi piace fare operazioni come questa:C'è un modo per chiamare la funzione `[<-` in` [`form?

`[<-`((z<-reshape2::melt(iris)), z[,"value"]>5, 3, 100) 

Melt iris, quindi assegnare il valore 100 al righe in cui lo value è maggiore di 5, quindi restituisce tutte le righe, non solo le righe selezionate. Questa funzione è descritta nella pagina per ?"["

Lo stesso codice con replace() (ben quasi lo stesso)

z[,"value"] <- replace(i <- ((z <- reshape2::melt(iris))[,"value"]), i > 5, 100) 

1) Ma la domanda è: esiste un modo per chiamare la funzione [<- utilizzando lo standard notazione parentesi iris[<-, blah, blah, blah, ?]?

modifica luglio 2016: quindi lo scopo di questa domanda NON è quello di replicare l'operazione. I dati non contano, l'esempio non ha importanza, il modo complesso di rimodellare i dati non ha importanza.

+1

È possibile definire una funzione '\' [.myClass \ '<- function (stuff) assegna (stuff)' o qualcosa di simile e quindi 'class (iris) <-" myClass "' –

+0

'' [.myClass' <- function (...) '[< -' (...); class (iris) <- c ("myClass", classe (iris)) '' or '' cake = function (...) '[<-' (...)' 'sono soluzioni valide ma richiedono dichiarazioni di funzione, che è chiaramente contro i desideri di un programmatore pigro. Non riesco a ottenere il vantaggio 'di presentarsi. – Vlo

+8

Hmm, forse il programmatore dovrebbe smettere di essere così pigro e mettere un po 'di lavoro ... haha ​​:) –

risposta

1

Per rispondere alla tua domanda: naturalmente no. Per

iris[<-, blah, blah, blah, ?] 

al lavoro, la funzione [ dovrebbe prendere un'altra funzione (o operatore) come secondo parametro, e [ è una primitiva che non permette che.

Si potrebbe obiettare "ma la funzione è chiamata [<-". Non è. Se si scrive

x[i,j,...] 

Poi si chiama una funzione [ con primo argomento x, secondo argomento i e così via. Nella riga di codice, i è la funzione <-. L'operatore di assegnazione è una funzione davvero:

> `<-` 
.Primitive("<-") 
> `<-`("x",1) 
> x 
[1] 1 

Quindi, ciò che si scrive in quella linea, si riduce a:

`[`(iris, <-, blah, blah ...) 

e che vi darà un errore di interprete di R; l'operatore di assegnazione è interpretato come un tentativo di assegnare qualcosa. Questo è chiaramente un codice non valido.

Si potrebbe proporre utilizzando apici inversi così diventa:

iris[`<-`, blah, blah, ... ] 

che si traduce in

`[`(iris, `<-`, blah, blah ,...) 

ma anche questo è qualcosa che non è e non sarà mai consentito dalla primitiva [.

Alcune persone hanno suggerito di poter scrivere il tuo metodo, e puoi - per le classi che hai definito tu stesso. Ma non è possibile ridefinire lo stesso [ per consentire questo per qualsiasi frame di dati generico, a meno che non si riscriva l'interprete R per riconoscere il costrutto come una chiamata a [<- anziché [.

Problemi correlati