2014-06-13 16 views
38

Se carico il pacchetto MASS:dplyr :: selezionare scontri funzione con MASS :: selezionare

library(MASS) 

quindi caricare tenta di eseguire dplyr::select, ottengo un errore:

library(dplyr) 
mtcars %.% 
select(mpg) 

# Error in select(`__prev`, mpg) : unused argument (mpg) 

Come posso utilizzare dplyr::select con il pacchetto MASS caricato?

+4

è possibile utilizzarlo come hai appena scritto: 'dplyr :: select (mpg)' –

risposta

40

Come ha detto Pascal, le seguenti opere

require(MASS) 
require(dplyr) 
mtcars %>% 
    dplyr::select(mpg) 
+17

Se si è sicuri che si sta per caricare MASSA e dplyr insieme molto spesso e usate 'select' molto, potreste riassegnare la funzione: selezionate <- dplyr :: select che potrebbe aiutare a salvare digitando 'dplyr ::' ripetutamente – KFB

+1

So che questo è vecchio ma comunque. Ho appena incontrato lo stesso problema. E apparentemente MASS è importato (tra gli altri) da ggplot2 quindi credo che molti probabilmente li useranno insieme. Anche se credo di aver usato ggplot2 e dplyr senza problemi prima ... – Latrunculia

+0

Ho un problema simile. Tuttavia, ciò che è strano è che questo problema non si è verificato fino ad oggi, e non ho davvero cambiato il mio codice. Ho solo inserito la sezione che ha causato l'errore in una condizione 'if (x == x) {...}'. Qualche idea sul perché questo errore appare improvvisamente, dove prima non c'era nessun problema? – deca

12

Questo mi succede più spesso di quanto avrei dovuto ammettere. dplyr scontri con MASS::select, plyr::summarise e tra le altre cose, specialmente quando si caricano pacchetti che caricano una di queste librerie tramite libreria (non dovrebbero, ma alcuni ancora lo fanno) o quando si carica dplyr nel proprio .Rprofile (no!). E può portare a problemi piuttosto oscuri, non sempre un messaggio di errore, in particolare i conflitti con plyr.

Recentemente ho appreso della funzione conflicts(). È utile, ma i conflitti "over-report" quando due pacchetti hanno funzioni identiche, ad es. tidyr :: %>% e dplyr :: %>%.

Così ho scritto a function per dirmi se sto impazzendo o se c'è effettivamente un conflitto che causa il bug corrente. Non solo controlla i conflitti, controlla se un certo pacchetto desiderato è quello "in cima" e se i corpi della funzione in realtà differiscono.

Fa questo per dplyr per impostazione predefinita, ma è possibile specificare un altro pacchetto utilizzando il parametro want_package. Ad esempio, mi capita spesso di incappare in recode e alpha, che vengono riutilizzati in molti pacchetti.

L'utilizzo è semplicemente: amigoingmad().

Per impostazione predefinita, lo farà automaticamente anche "fissare" le cose, se dplyr non è "in alto", utilizzando i seguenti comandi:

detach("package:dplyr", character.only = TRUE) 
library("dplyr", character.only = TRUE) 

Si noti che la funzione segnalerà se una funzione specificata dall'utente è il blocco dplyr, ma non lo aggiusta automaticamente per motivi di sicurezza (basta rimuovere la funzione in quel caso).

Per ora, questa soluzione non mi ha causato alcun problema. Naturalmente non vorrei difendere l'uso di questo nel codice di produzione, ma quando esegui il debug di un file .Rmd e potresti aver incasinato l'ordine di caricamento per errore, è un modo rapido per scoprirlo.

Se si desidera che questo in un pacchetto:

devtools::install_github("rubenarslan/formr") 
+1

Bello. Pensavo stavo impazzendo. – nigelhenry

3

Se si carica prima la MASS biblioteca e secondo l'dplyr uno

library (MASS) 
library (dplyr) 

poi la prima versione della funzione select nella sessione searchpaths() sarà quello nella libreria dplyr.

Quindi

select(mtcars, mpg) 

funzionerà come

dplyr::select(mtcars, mpg) 
Problemi correlati