如何在 2 个具有相同名称的不同库中使用 2 个不同的函数

How to use 2 different functions in 2 different libraries that have the same name

我正在尝试探索 "gam" 函数在 mgcv 包和 gam 包中的工作方式的区别。但是,我无法在一个 R 会话中 运行 两个 gam 函数。我想如果我以 mgcv::gam 或 gam::gam 作为序言,它将能够 运行 正确的功能,但看起来我必须分离 mgcv 才能 运行 gam gam包中的函数。

library(ISLR)
library(mgcv)
library(gam)

# I get an error message when it runs this
gam.m3 <- gam::gam(wage~s(year,4)+s(age,5)+education,data=Wage)

# No error message when I detach mgcv
detach(package:mgcv)
gam.m3 <- gam::gam(wage~s(year,4)+s(age,5)+education,data=Wage)

有什么方法可以 运行 在一个会话中同时运行两个 gam 功能?

下面是输出:

> library(ISLR)
> library(mgcv)
> library(gam)
> #I get an error message when it runs this
> gam.m3 <- gam::gam(wage~s(year,4)+s(age,5)+education,data=Wage)
Error in terms.formula(reformulate(term[i])) : 
  invalid model formula in ExtractVars
> #No error message when I detach mgcv
> detach(package:mgcv)
> gam.m3 <- gam::gam(wage~s(year,4)+s(age,5)+education,data=Wage)
Warning message:
In model.matrix.default(mt, mf, contrasts) :
  non-list contrasts argument ignored

更新:我用一个干净的 R 会话重新运行 这个,故事是不同的。之前,我清除了工作区但没有清除 R 会话。现在,如果我 运行 使用干净的会话,gam.m3 模型似乎可以工作。但是 - 如果我在 mgcv 之前更改库加载和加载 gam 的顺序,我会得到同样的错误。当在加载 gam 后加载 mgcv 时,我收到此消息:

The following objects are masked from ‘package:gam’:

gam, gam.control, gam.fit, s

所以我猜加载 mgcv 的部分原因是您不能再使用 gam 中的某些功能?那很烦人。仅供参考,我在加载 mgcv 后加载 gam 时收到类似的警告消息 - 某些对象将被 'package:mgcv'.

屏蔽

如我对 的回答所示,您不能使用 gam::s

但是,您可以告诉 R 评估 gam 包命名空间中的调用:

library(ISLR)
library(gam)

fit1 <- gam(wage~s(year,4)+s(age,5)+education,data=Wage)

library(mgcv)

gam::gam(wage~s(year,4)+s(age,5)+education,data=Wage)
#errors

fit2 <- eval(quote(gam(wage~s(year,4)+s(age,5)+education,data=Wage)), 
               envir = asNamespace("gam"))
#works

all.equal(coef(fit1), coef(fit2))
#[1] TRUE