Felix Andrews
2008-Jul-28 13:15 UTC
[Rd] equivalent to "require" for imports? (cairoDevice)
Hi R-devel I use the packages RGtk2 and cairoDevice. The cairoDevice package has a few stand-alone functions, plus "asCairoDevice" which depends on RGtk2 and calls require(RGtk2). So cairoDevice lists RGtk2 under "Suggests" in the DESCRIPTION file. It can not Import RGtk2 because that would force all users to install RGtk2. The upshot of this is, if you *import* the RGtk2 namespace into another package and then call asCairoDevice(), RGtk2 is attached to the user's search path. That is significant because RGtk2 exports a large number of objects: -- 7476 to be exact -- which can clog up things like help.search and autocompletion. What is the recommended solution? Could asCairoDevice call loadNamespace rather than require? -- Felix Andrews / ??? PhD candidate Integrated Catchment Assessment and Management Centre The Fenner School of Environment and Society The Australian National University (Building 48A), ACT 0200 Beijing Bag, Locked Bag 40, Kingston ACT 2604 http://www.neurofractal.org/felix/ 3358 543D AAC6 22C2 D336 80D9 360B 72DD 3E4C F5D8
Prof Brian Ripley
2008-Jul-28 13:33 UTC
[Rd] equivalent to "require" for imports? (cairoDevice)
On Mon, 28 Jul 2008, Felix Andrews wrote:> Hi R-devel > > I use the packages RGtk2 and cairoDevice. The cairoDevice package has > a few stand-alone functions, plus "asCairoDevice" which depends on > RGtk2 and calls require(RGtk2). So cairoDevice lists RGtk2 under > "Suggests" in the DESCRIPTION file. It can not Import RGtk2 because > that would force all users to install RGtk2. > > The upshot of this is, if you *import* the RGtk2 namespace into > another package and then call asCairoDevice(), RGtk2 is attached to > the user's search path. That is significant because RGtk2 exports a > large number of objects: -- 7476 to be exact -- which can clog up > things like help.search and autocompletion. > > What is the recommended solution? Could asCairoDevice call > loadNamespace rather than require?The code is> asCairoDevicefunction (widget, pointsize = 10) { if (!require("RGtk2")) stop("asGtkDevice requires the RGtk package") if (!inherits(widget, "GtkDrawingArea") && !inherits(widget, "GdkDrawable")) { stop("Object being used as a Cairo Device must be a GtkDrawingArea or GdkDrawable") } .Call("do_asCairoDevice", widget, as.numeric(pointsize), PACKAGE = "cairoDevice") } Note that the stop() message is wrong (wrong function name, wrong package) and seems most likely an error. But why not ask the package author? The normal solution is to use :: to load functions from a name space required only in rarely used functions in your package. -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595