代码之家  ›  专栏  ›  技术社区  ›  Simon Schick

R gam和mgcv之间的包冲突?

  •  7
  • Simon Schick  · 技术社区  · 11 年前

    分离中的包 R 这不是好的做法(参见 ?detach ),但出于某些原因,我不得不在两个包之间切换 gam mgcv 一旦 mgcv公司 已附加和分离(命名空间中的所有依赖项已卸载!),函数 伽马 产生一些奇怪的错误(请原谅术语)。看起来-即使之前卸载了一步- 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()
    

    我的会话信息是(新会话):

    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
    

    我使用gam(1.09)和mgcv(1.7-28)的最新版本。任何提示都很感谢!

    1 回复  |  直到 10 年前
        1
  •  4
  •   Karl Forner    10 年前

    正如您所预料的,问题是gam和mgcv包都为“gam”对象安装了S3方法。 但是,如?分离文档:

    将不会删除命名空间中已注册的S3方法。

    因此,在您的案例中,很容易看出这是您问题的原因:

    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
    

    结论:确保永远不要加载mgcv

    推荐文章
    S.K.  ·  gamm的R粘贴公式
    7 年前