2014-03-02 21 views
6

Das Entfernen von Paketen in R ist keine gute Übung (siehe ?detach), aber aus bestimmten Gründen muss ich zwischen den Paketen gam und mgcv wechseln. Sobald mgcv angefügt und getrennt wurde (und alle Abhängigkeiten im Namespace entladen wurden!), Erzeugen Funktionen von gam einige seltsame Fehler (bitte verzeiht die Terminologie). Es scheint, dass - auch wenn einen Schritt zuvor entladen - mgcv und Freunde sind zurück in den Namespace und Funktion Dispatching geht schief. Hat jemand vorher das selbe Problem gehabt?R Paketkonflikt zwischen Gam und mgcv?

# fresh session 
t.s1 <- search() 
t.lN1 <- loadedNamespaces() 

# some dummy data 
data <-data.frame(is.exc=sample(x=c(0,1),size=100,replace=T), 
year=1:100,doy=rep(1:5,times=20)) 
t.dof <- 2 

# everything works fine 
library(gam) 
t.gam1 <- gam::gam(is.exc~s(year,df=t.dof)+s(doy,df=t.dof),data=data,family=poisson) 
t.pred1 <- gam::predict.gam(t.gam1,newdata=data,type='terms') 
detach('package:gam',unload=T,character.only=T) 
detach('package:splines',unload=T,character.only=T) 

# compare attached packages and namespaces with fresh session 
t.s2 <- search() 
t.lN2 <- loadedNamespaces() 
identical(t.s1,t.s2) 
identical(t.lN1,t.lN2) 

# attach and detach mgcv 
library(mgcv) 
detach('package:mgcv',unload=T,character.only=T) 
unloadNamespace('nlme') 
unloadNamespace('Matrix') 
unloadNamespace('lattice') 
unloadNamespace('grid') 

# compare again attached packages and namespaces with fresh session 
t.s2 <- search() 
t.lN2 <- loadedNamespaces() 
identical(t.s1,t.s2) 
identical(t.lN1,t.lN2) 

# use package gam again and produce errors 
library(gam) 
t.gam2 <- gam::gam(is.exc~s(year,df=t.dof)+s(doy,df=t.dof),data=data,family=poisson) 
gam::summary.gam(t.gam2) 
t.pred2 <- gam::predict.gam(t.gam2,newdata=data,type='terms') 

# why do we have mgcv and friends in the namespace? 
loadedNamespaces() 

Meine Sitzung Infos sind (frische Session):

R version 3.0.2 (2013-09-25) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8   LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

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

loaded via a namespace (and not attached): 
[1] tools_3.0.2 

und ich verwende die neuesten Versionen von gam (1,09) und mgcv (1,7-28). Irgendwelche Hinweise werden geschätzt!

Antwort

4

Das Problem, wie Sie ANTICIPATED, ist, dass sowohl Gam und mgcv Pakete S3-Methoden für "Gam" Objekte installieren. Aber, wie in der Dokumentation angegeben:

registrierte S3-Methoden aus dem Namespace werden nicht entfernt.

Also in Ihrem Fall ist es leicht zu sehen, dass die Ursache Ihrer Probleme ist:

library(gam) 
# installs gam::print.summary.gam 
identical(getS3method('print', 'summary.gam'), gam:::print.summary.gam) 
[1] TRUE 


library(mgcv) 
# installs mgcv::print.summary.gam 
identical(getS3method('print', 'summary.gam'), mgcv:::print.summary.gam) 
[1] TRUE 

# save a pointer before unloading namespaces 
mgcv_psgam <- mgcv:::print.summary.gam 

detach('package:mgcv',unload = TRUE, character.only = TRUE) 
# after the detach, the method from mgcv is still installed !!! 
identical(getS3method('print', 'summary.gam'), mgcv_psgam) 
[1] TRUE 

Fazit: stellen Sie sicher nie laden mgcv