How to deal with package conflicts
On Fri, 2011-11-25 at 10:42 -0500, Michael Friendly wrote:
Duncan provided one suggestion: make ridge() an S3 generic, and rename ridge() to ridge.coxph(), but this won't work, since you use ridge() inside coxph() and survreg() to add a penalty term in the model formula. Another idea might be simply to not export ridge(), but I have the feeling this will break your R CMD checks.
The S3 generic idea won't work. The argument inside ridge(x) is an
ordinary variable, and it's the argument inside that a generic uses for
dispatch. I want to dispatch based on the context, which is what the
namespace mechanism does for a call to for instance coxpenal.fit, a non
exported survival function.
I suspect that not exporting ridge would work for
coxph(Surv(time, status) ~ ph.ecog + ridge(age), data=lung)
but not for
myform <-Surv(time, status) ~ ph.ecog + ridge(age)
coxph(myform, data=lung)
(I haven't test this) This is because formulas are treated rather like
functions, with bindings coming into play when they are first defined,
not when they are first used.
Alternatively, my particular problem (wanting to use car::vif in my package documentation) would be solved if John Fox considered making making survival a Suggests: package rather than a Depends: one. This might work, since survival is only referenced in car by providing Anova() methods for coxph models. I think all of this raises a general issue of unintended consequences of "package bloat," where (a) Depends: packages are forced to load by require()/library(), whether they are really needed or not; (b) There is nothing like require(car, depends=FALSE) to circumvent this; (c) Once a require()'d package is loaded, it cannot be unloaded; (d) AFAIK, there is no way for a package author to override the masking of functions or data provided by other other packages, except by using mypackage::myfun() calls. To me this seems to be a flaw in the namespace mechanism.
I will say that the long list of "reverse depends" on the survival package does give me pause when making changes. Terry T.