【问题标题】:How to use 2 different functions in 2 different libraries that have the same name如何在 2 个同名的不同库中使用 2 个不同的函数
【发布时间】:2019-06-02 18:11:48
【问题描述】:

我正在尝试探索“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)

有没有一种方法可以在一个会话中同时运行两个游戏功能?

下面是输出:

> 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' 屏蔽。

【问题讨论】:

  • 尝试在mgcv 之前加载gam 包。看看这是否有所作为。
  • 我无法重现此问题。您能否:(1) 在新的 R 会话中尝试此代码,如果仍然收到错误消息,(2) 编辑您的问题以包含来自 sessionInfo() 的输出?
  • @duckmayr 感谢 cmets。见更新。此外,正如 Shree 猜测的那样,加载顺序会有所不同。
  • @TimW 感谢您的更新。 “加载 mgcv 的部分原因是您不能再在 gam 中使用某些功能?”这个问题的答案是否定的。当一个函数被另一个函数屏蔽时,您仍然可以使用命名空间运算符 (::) 访问它。如果两个包具有相同名称的函数,如果没有指定命名空间,则使用 last 加载的包中的函数。这就是为什么您会收到有关屏蔽的警告 - 如果您未通过 gam::mgcv:: 指定,它可以帮助您跟踪将调用哪个包的函数
  • @duckmayr 我仍然很困惑。当我在 mgcv 之前加载 gam 时,我在运行“gam.m3

标签: r libraries gam mgcv


【解决方案1】:

如我对your other question的回答所示,你不能使用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

【讨论】:

    猜你喜欢
    • 2011-07-30
    • 2014-05-25
    • 2011-09-15
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多