gpt4 book ai didi

R gam 和 mgcv 之间的包冲突?

转载 作者:行者123 更新时间:2023-12-02 08:30:48 33 4
gpt4 key购买 nike

R 中分离包并不是一个好的做法(请参阅?detach),但由于某些原因,我必须在包 gammgcv。一旦 mgcv 被附加和分离(并且卸载命名空间中的所有依赖项!),gam 的函数会产生一些奇怪的错误(请原谅术语)。看起来 - 即使之前卸载了一步 - mgcv 和 friend 们又回到了命名空间中,并且函数调度出了问题。以前有人遇到过同样的问题吗?

# 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()

我的 session 信息是(新 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

我使用最新版本的 gam (1.09) 和 mgcv (1.7-28)。任何提示表示赞赏!

最佳答案

正如您所预料的,问题在于 gam 和 mgcv 软件包都为“gam”对象安装了 S3 方法。但是,正如 ?detach 文档中所述:

registered S3 methods from the namespace will not be removed.

因此,在您的情况下,很容易看出这是问题的原因:

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

关于R gam 和 mgcv 之间的包冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22126611/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com