2012-06-07 7 views
17

Chciałem stworzyć pręt, w którym pręty były sortowane według wysokości, a nie alfabetycznie według kategorii. To działało dobrze, gdy jedyną paczką, którą wczytałem, był ggplot2. Jednak po załadowaniu kilku kolejnych pakietów i uruchomieniu tego samego kodu, który utworzył, posortował i narysował moją ramkę danych, pręty ponownie zaczęły być sortowane alfabetycznie.Współczynnik podziału daje różne wyniki, w zależności od tego, które pakiety są ładowane.

Sprawdzałem ramkę danych za każdym razem przy użyciu str() i okazało się, że atrybuty ramki danych były teraz inne, mimo że za każdym razem uruchamiałem ten sam kod.

Mój kod i dane wyjściowe są wymienione poniżej. Czy ktoś może wyjaśnić różne zachowanie? Dlaczego ładowanie kilku pozornie niepowiązanych pakietów (niezwiązanych w tym sensie, że żadna z używanych funkcji nie wydaje się być maskowana przez nowo załadowane pakiety) zmienia wynik działania funkcji transform()?

Przypadek 1: Wystarczy ggplot2 ładowane

library(ggplot2) 

group = c("C","F","D","B","A","E") 
num = c(12,11,7,7,2,1) 
data = data.frame(group,num) 
data1 = transform(data, group=reorder(group,-num)) 

> str(data1) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "C","F","B","D",..: 1 2 4 3 5 6 
    ..- attr(*, "scores")= num [1:6(1d)] -2 -7 -12 -7 -1 -11 
    .. ..- attr(*, "dimnames")=List of 1 
    .. .. ..$ : chr "A" "B" "C" "D" ... 
$ num : num 12 11 7 7 2 1 

Przypadek 2: Załaduj jeszcze kilka pakietów, a następnie uruchomić ponownie ten sam kod

library(plyr) 
library(xtable) 
library(Hmisc) 
library(gmodels) 
library(reshape2) 
library(vcd) 
library(lattice) 

group = c("C","F","D","B","A","E") 
num = c(12,11,7,7,2,1) 
data = data.frame(group,num) 
data1 = transform(data, group=reorder(group,-num)) 

> str(data1) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "A","B","C","D",..: 3 6 4 2 1 5 
$ num : num 12 11 7 7 2 1 

UPDATE: SessionInfo()

Case 1: Ran sessionInfo() po załadowaniu ggplot2

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
    [1] C/en_US.UTF-8/C/C/C/C 

attached base packages: 
    [1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
    [1] ggplot2_0.9.1 

loaded via a namespace (and not attached): 
    [1] MASS_7.3-18  RColorBrewer_1.0-5 colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2  grid_2.15.0  
[7] labeling_0.1  memoise_0.1  munsell_0.3  plyr_1.7.1   proto_0.3-9.2  reshape2_1.2.1  
[13] scales_0.2.1  stringr_0.6  tools_2.15.0 

Przypadek 2: Ran sessionInfo() po załadowaniu dodatkowych pakietów

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
    [1] C/en_US.UTF-8/C/C/C/C 

attached base packages: 
    [1] grid  splines stats  graphics grDevices utils  datasets methods base  

other attached packages: 
    [1] lattice_0.20-6 vcd_1.2-13  colorspace_1.1-1 MASS_7.3-18  reshape2_1.2.1 gmodels_2.15.2 
[7] Hmisc_3.9-3  survival_2.36-14 xtable_1.7-0  plyr_1.7.1  ggplot2_0.9.1 

loaded via a namespace (and not attached): 
    [1] RColorBrewer_1.0-5 cluster_1.14.2  dichromat_1.2-4 digest_0.5.2  gdata_2.8.2  gtools_2.6.2  
[7] labeling_0.1  memoise_0.1  munsell_0.3  proto_0.3-9.2  scales_0.2.1  stringr_0.6  
[13] tools_2.15.0 
+0

można udostępnić wyjście 'sessionInfo()'?Jeśli ktokolwiek może pomóc, być może będzie musiał dopasować twoje R i wersje pakietów, aby to powtórzyć. – joran

+0

Mogę replikować to na R 2.15.0 z aktualnymi pakietami CRAN (na Ubuntu) – Justin

+1

Bardzo interesujące. Wygląda na to, że zmiana w wynikach 'transform()' pojawia się dopiero po wczytaniu 'gmodels' (i nie jest naprawiana przez późniejsze odłączanie' gmodels'). Jestem zaintrygowany ... (FWIW, jestem w systemie Windows XP, z uruchomionym R-develem, więc wygląda na to, że nie jest to problem specyficzny dla systemu operacyjnego lub wersji.) –

Odpowiedz

13

Dzieje się tak, ponieważ:

  1. gmodels import gdata
  2. gdata tworzy nową metodę reorder.factor

Rozpocznij czystą sesję. Następnie:

methods("reorder") 
[1] reorder.default* reorder.dendrogram* 

Teraz załadować gdata (lub załadować gmodels, który ma ten sam efekt):

library(gdata) 
methods("reorder") 
[1] reorder.default* reorder.dendrogram* reorder.factor 

Wskazówka nie ma maskowania, ponieważ reorder.factor nie istnieje w bazie

Odtworzenie problem, ale tym razem jawnie wywołaj różne pakiety:

group = c("C","F","D","B","A","E") 
num = c(12,11,7,7,2,1) 
data = data.frame(group,num) 

bazowa wersja R (używając reorder.default):

str(transform(data, group=stats:::reorder.default(group,-num))) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "C","F","B","D",..: 1 2 4 3 5 6 
    ..- attr(*, "scores")= num [1:6(1d)] -2 -7 -12 -7 -1 -11 
    .. ..- attr(*, "dimnames")=List of 1 
    .. .. ..$ : chr "A" "B" "C" "D" ... 
$ num : num 12 11 7 7 2 1 

Wersja gdata (używając reorder.factor):

str(transform(data, group=gdata:::reorder.factor(group,-num))) 
'data.frame': 6 obs. of 2 variables: 
$ group: Factor w/ 6 levels "A","B","C","D",..: 3 6 4 2 1 5 
$ num : num 12 11 7 7 2 1 
+4

można uzyskać "oczekiwaną" porządek używając 'wersję gdata :: reorder.factor' dodając' FUN = identity' argumentu: 'data1 = transformacji (dane, grupa = Reorder (grupa -num, zabawa = tożsamości)) '. –

+2

Wystarczy, aby upewnić się zrozumieć lekcję tutaj: Podczas ładowania pakietu, można uzyskać różne zachowanie z dokładnie tego samego kodu, nawet w przypadku braku maskowania, jeśli nowy pakiet ma metodę specyficzne dla obiektu (w tym przypadku 'reorder.factor'), który" nadpisuje "zachowanie metody" najwyższego "poziomu (w tym przypadku ogólnego" ponownego zamawiania "), które w przeciwnym razie miałoby zastosowanie do twojego obiektu. Czy to jest poprawne? – eipi10

+1

@ eipi10 Tak, twój przykład wyraźnie to ilustruje. Pedanteria o terminologii: 'reorder.factor' zostaje wywołany zamiast' reorder.default' (co w pewnym sensie nadpisuje poprzednie zachowanie). To bardzo interesujący problem. Dziękuję Ci. – Andrie

Powiązane problemy