2015-05-14 7 views
17

Sto correndo un esempio in R, passando attraverso i passi e tutto funziona finora ad eccezione di questo codice genera un errore:Errore: impossibile trovare la funzione "%>%"

words <- dtm %>% 
as.matrix %>% 
colnames %>% 
(function(x) x[nchar(x) < 20]) 

Error: could not find function "%>%"

Non capisco quale sia il vantaggio dell'utilizzo di questo operatore speciale %>% e qualsiasi feedback sarebbe ottimo.

+0

Correlato: http://stackoverflow.com/questions/27125672/what-does-function-mean-in-r – LJW

risposta

35

È necessario installare prima il pacchetto magrittr, quindi dovrebbe funzionare.

install.packages("magrittr") 
library(magrittr) 

Il tubo operatore %>% è stato introdotto per "i tempi di sviluppo e diminuzione per migliorare la leggibilità e la manutenibilità del codice."

Ma ognuno deve decidere da solo se si adatta perfettamente al proprio flusso di lavoro e rende le cose più semplici. Per ulteriori informazioni su magrittr, fare clic su here.

Non utilizzando il tubo %>%, questo codice potrebbe restituire lo stesso il tuo codice:

words <- colnames(as.matrix(dtm)) 
words <- words[nchar(words) < 20] 
words 

EDIT: (I rivolgo la mia risposta a causa di un commento molto utile realizzato da @Molx)

Despite being from magrittr , the pipe operator is more commonly used with the package dplyr (which requires and loads magrittr), so whenever you see someone using %>% make sure you shouldn't load dplyr instead.

+0

Significa anche che il codice scritto sopra potrebbe essere scritto in modo diverso senza utilizzare%> % – Haidar

+9

Nonostante sia di 'magrittr', l'operatore di pipe è più comunemente usato con il pacchetto' dplyr' (che richiede e carica 'magrittr'), quindi ogni volta che vedi qualcuno che usa'%>% 'assicurati di non caricare 'dplyr' invece. – Molx

5

Su Windows: se si utilizza%>% all'interno di un ciclo% dopar%, è necessario aggiungere un riferimento per caricare il pacchetto dplyr (o dplyr carichi).

Esempio:

plots <- foreach(myInput=iterators::iter(plotCount), .packages=c("RODBC", "dplyr")) %dopar% 
{ 
    return(getPlot(myInput)) 
} 

Se si omette il comando .packages, e utilizzare %do% invece per rendere il tutto eseguito in un unico processo, quindi funziona bene. Il motivo è che viene eseguito tutto in un unico processo, quindi non è necessario caricare in modo specifico nuovi pacchetti.

+0

Questo è un buon punto e vale la pena evidenziarlo in particolare in relazione a foreach. Ho avuto problemi in passato con questo, ed è un problema diverso da quello risolto dalla risposta accettata. –

+0

Non sono sicuro se questo sia il posto giusto per evidenziare anche questo, ma ho suggerito e modificato in base al pacchetto iterators che semplifica il ciclo foreach. Sentiti libero di ignorare se questo è inappropriato. –

+1

Grazie. Mi ha salvato. Non avevo idea di aver bisogno di dichiarare le dipendenze nel 'foreach'. –