INSTALL
script to create
an image of the package at install time. This image is loaded when the corresponding library
is attached, instead of parsing and evaluating the
source.There are several reasons to need this.
If the package source does some computation other than just assigning functions, it may be difficult or impossible to get the desired effect through the form of parse-eval used when the library is attached.
For example, the RSMethods
package and all
packages that use it will need to define formal classes
and methods and save the resulting objects in the
package. By definition, these computations default to save the results in
the global environment (where=1). It is possible to trick
the computations
to save the results in the package's environment, but the
mechanism needed is messy and unintuitive, and not something we
want to pass on to future contributors. (Packages
RSMethods
and OOP
in the
Omegahat collection are examples of how it can be done.)
The special computations needed for installing some of the newer
packages can take considerable time. This is true of the
RSMethods
example and of some of the
inter-system interface packages.
When we embed R in other systems, startup
time becomes a more serious issue. Even for conventional,
but large, packages, startup time can be nontrivial.
The proposed, optional alternative works as follows.
.First.lib
loads the image and then
invokes the actual .First.lib
from the package, if any.
This version of installation can be triggered either by an option
(-s
or --save
) to the
INSTALL
command, or by the presence of a file
INSTALL.R
in the package directory. (Because
some packages may require installation this way, we need a
package-specific mechanism to trigger it. The command option
--no-save
overrides the INSTALL.R
file.)
If the INSTALL.R
file is empty, its
presence causes the version of .First.lib
mentioned above to be copied to the installed package
source. If the file is non-empty, its contents are copied
instead, allowing the package designer to customize the
installation procedure (so far, no example requiring this has come up).
The procedure of saving and loading an image of the package objects
should be compatible with the standard installation for
objects assigned directly in the source. If the package
source does something with strictly session scope, this would
need to be done in the .First.lib
with the new
installation. One likely example is requiring other
packages: the calls to require
need to be done
from .First.lib
.
The environment variable R_SAVE_IMAGE
is set to
true
and can be used by the package code to take
different action when the code is being run to create a
loadable image.
Two examples of packages set up for optional installation in this form
are in the Omegahat packages download area: the RSMethods
package, and the (unadvertised but
available) OOP
package for object-oriented programming.
For the proposed changes, see the INSTALL script and the diff's against the current version.