[Rd] odd assignInNamespace / setGeneric interaction

William Dunlap wdunlap at tibco.com
Wed Apr 18 22:38:06 CEST 2018

A coworker got tired of having to type 'yes' or 'no' after quitting R: he
never wanted to save the R workspace when quitting.  So he added
assignInNamespace lines to his .Rprofile file to replace base::q with
one that, by default, called the original with save="no"..

  utils::assignInNamespace(".qOrig", base::q, "base")
  utils::assignInNamespace("q", function(save = "no", ...)
base:::.qOrig(save = save, ...), "base")

This worked fine until he decide to load the distr package:

  > suppressPackageStartupMessages(library(distr))
  Error: package or namespace load failed for ‘distr’ in
   there is no package called ‘.GlobalEnv’

distr calls setGeneric("q"), which indirectly causes the environment
of base::q, .GlobalEnv, to be loaded as a namespace, causing the error.
Giving his replacement q function the environment getNamespace("base")
avoids the problem.

I can reproduce the problem by making a package that just calls
setGeneric("as.hexmode",...) and a NAMEPACE file with
exportMethods("as.hexmode").  If my .Rprofile puts a version of as.hexmode
with environment .GlobalEnv into the base namespace, then I get the same
error when trying to load the package.

I suppose this is mostly a curiosity and unlikely to happen to most people
but it did confuse us for a while.

Bill Dunlap
TIBCO Software
wdunlap tibco.com

	[[alternative HTML version deleted]]

More information about the R-devel mailing list