2014-06-13 18 views
38

Gdybym załadować pakiet MASS:dplyr :: select starcia funkcyjne o masie :: wybrać

library(MASS) 

następnie załadować próby uruchomienia dplyr::select, otrzymuję błąd:

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

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

Jak mogę użyć dplyr::select z załadowanym pakietem MASS?

+4

Można używać go jako po prostu napisał: 'dplyr :: select (mpg)' –

Odpowiedz

40

Jak powiedział Pascal dodaje działa

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

Jeżeli jesteś pewien, że idą do załadowania MASS i dplyr razem bardzo często i używajcie "select" bardzo dużo, moglibyście ponownie przypisać funkcję: wybierz <- dplyr :: wybierz, co mogłoby pomóc w zapisywaniu "dplyr ::" wielokrotnie – KFB

+1

Wiem, że to jest stare, ale tak czy inaczej. Właśnie napotkałem ten sam problem. Najwyraźniej MASS jest importowany (między innymi) przez ggplot2, więc myślę, że wielu z nich prawdopodobnie użyje ich razem. Chociaż uważam, że używam ggplot2 i dplyr bez problemów przed ... – Latrunculia

+0

Mam podobny problem. Jednak dziwne jest to, że problem ten nie pojawił się do dzisiaj, a ja naprawdę nie zmieniłem kodu. Podłączyłem tylko sekcję powodującą błąd do warunku 'if (x == x) {...}'. Jakieś pomysły, dlaczego ten błąd nagle się pojawia, gdzie wcześniej nie było problemu? – deca

12

Dzieje się tak do mnie częściej niż powinienem przyznać. dplyr zderza się z MASS::select, plyr::summarise i stats::filter między innymi, szczególnie przy ładowaniu pakietów, które ładują jedną z tych bibliotek przez bibliotekę (nie powinny, ale niektóre nadal robią) lub gdy ładujesz dplyr do swojego .Rprofile (nie!). Może to prowadzić do dość niejasnych problemów, nie zawsze jest to komunikat o błędzie, zwłaszcza konflikty z plyr.

Niedawno dowiedziałem się o funkcji conflicts(). Jest to użyteczne, ale konflikty "over-reports", gdy dwa pakiety mają identyczne funkcje, np. tidyr :: %>% i dplyr :: %>%.

Napisałem więc a function, aby powiedzieć mi, czy oszalałem, czy też jest to konflikt powodujący obecny błąd. Sprawdza nie tylko konflikty, sprawdza, czy pewne pożądane opakowanie jest "na wierzchu" i czy jego funkcje rzeczywiście różnią się.

Robi to domyślnie dla dplyr, ale można podać inny pakiet, używając parametru want_package. Na przykład często się potknąłem o recode i alpha, które są ponownie wykorzystywane w wielu pakietach.

Użycie jest po prostu: amigoingmad().

Domyślnie będzie to również automatycznie „naprawić” rzeczy jeśli dplyr nie jest „na wierzchu”, stosując następujące polecenia:

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

pamiętać, że funkcja będzie raport, jeżeli funkcja określony przez użytkownika jest blokowanie dplyr, ale nie naprawia tego automatycznie dla bezpieczeństwa (po prostu usuń funkcję w tym przypadku).

Na razie to rozwiązanie nie sprawiło mi żadnych problemów. Oczywiście nie zalecałbym używania tego w kodzie produkcyjnym, ale kiedy debugujesz plik .Rmd i mógł przypadkowo zepsuć kolejność ładunków, jest to szybki sposób, aby się tego dowiedzieć.

Jeśli chcesz to w opakowaniu:

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

Piękny. Myślałem, że oszaleję. – nigelhenry

3

Jeśli załadować pierwszyMASS biblioteka i sekunddplyr jeden

library (MASS) 
library (dplyr) 

następnie pierwsza wersja funkcji select w twojej sesji searchpaths() będzie tą z biblioteki dplyr.

Stąd

select(mtcars, mpg) 

będzie działać jako

dplyr::select(mtcars, mpg)