Skip to content

equivalent to "require" for imports? (cairoDevice)

3 messages · Felix Andrews, Brian Ripley, Michael Lawrence

#
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?
#
On Mon, 28 Jul 2008, Felix Andrews wrote:

            
The code is
function (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.