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

泪湿孤枕 提交于 2019-12-11 06:14:45

问题


I'm trying to explore the difference in how the "gam" function works in the mgcv package versus the gam package. But, I'm not able to run both gam functions in one R session. I thought if I preface with mgcv::gam or gam::gam it would be able to run the right function, but it looks like I have to detach mgcv in order to run the gam function in the gam package.

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)

Is there a way I can run both gam functions in one session?

Below is the output:

> 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

Update: I re-ran this with a clean R session and the story is different. Before, I cleared the workspace but did not have a clear R session. Now, if I run with a clean session the gam.m3 model seems to work. BUT - if I change the order of the library load and load gam before mgcv, I get the same error. When mgcv is loaded after gam is loaded, I do get this message:

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

gam, gam.control, gam.fit, s

So I guess just part of the deal of loading mgcv is that you can no longer use certain functions in gam? That is annoying. FYI I get the analogous warning message when loading gam after mgcv is loaded - that certain objects will be masked from 'package:mgcv'.


回答1:


As shown in my answer to your other question, you can't use gam::s.

However, you can tell R to evaluate the call in the gam package namespace:

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


来源:https://stackoverflow.com/questions/56417685/how-to-use-2-different-functions-in-2-different-libraries-that-have-the-same-nam

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!