[Rd] SaveImage, LazyLoad, S4 and all that {was "install.R ... files"}
Prof Brian Ripley
ripley at stats.ox.ac.uk
Sun Feb 5 16:50:30 CET 2006
On Fri, 3 Feb 2006, Robert Gentleman wrote:
> My understanding, and John or others may correct that, is that you need
> SaveImage if you want to have the class hierarchy and generic functions, plus
> associated methods all created and saved at build time.
That meaning the time of using R CMD INSTALL rather than using R CMD
build, I guess? (We do have an unfortunate ambiguity.)
> This is basically a sort of compilation step, and IMHO, should always be
> done since it only needs to be done once, rather than every time a
> package is loaded. Note that attaching your methods to other people's
> generics has to happen at load time, since you won't necessarily know
> where they are or even what they are until then (using an import
> directive may alleviate some of those issues but I have not tested just
> what does and does not work currently).
My understanding is that `compilation step' creates objects which are then
saved in the image. Such objects would also be saved if the image is
converted into a lazyload database.
> I hope that LazyLoad does what it says it does, that is dissociates the value
> from the symbol in such a way that the value lives on disk until it is
> wanted, but the symbol is available at package load time. I do not see how
> this relates to precomputing an image,
You obviously have this defined a different way to me: I believe (and so
does my dictionary) that the image is what I save in my camera, not the
real world scene. I understand 'save' to save an image of an environment,
that is to make a representation on a connection that can be used to
recreate the environment at a later date.
> and would not be very happy if the two ideas became one, they really are
> different and can be used to solve very different problems.
To create a lazyload database you first need an environment to save. On
loading the package it then recreates not the environment but symbols
linked to promises that will recreate the values at a later date. So both
mechanisms create an environment which they `image' in different ways.
The difference here is an inadvertent difference in the Unix INSTALL
script, which I have now corrected.
> Prof Brian Ripley wrote:
>> The short answer is that there are no known (i.e. documented) differences,
>> and no examples on CRAN which do not work with lazy-loading (except party,
>> which loads the saved image in a test). And that includes examples of
>> packages which share S4 classes. But my question was to tease things like
>> this out.
>>
>> You do need either SaveImage or LazyLoad in a package that defines S4
>> classes and methods, since SetClass etc break the `rules' for R files in
>> packages in `Writing R Extensions'.
>>
>> When I have time I will take a closer look at this example.
>>
>>
>> On Fri, 3 Feb 2006, Martin Maechler wrote:
>>
>>
>>>>>>>> "Seth" == Seth Falcon <sfalcon at fhcrc.org>
>>>>>>>> on Thu, 02 Feb 2006 11:32:42 -0800 writes:
>>>
>>> Seth> Thanks for the explaination of LazyLoad, that's very helpful.
>>> Seth> On 1 Feb 2006, ripley at stats.ox.ac.uk wrote:
>>> >> There is no intention to withdraw SaveImage: yes. Rather, if
>>> >> lazy-loading is not doing a complete job, we could see if it could
>>> >> be improved.
>>>
>>> Seth> It seems to me that LazyLoad does something different with respect
>>> to
>>> Seth> packages listed in Depends and/or how it interacts with
>>> namespaces.
>>>
>>> Seth> I'm testing using the Bioconductor package graph and find that if
>>> I
>>> Seth> change SaveImage to LazyLoad I get the following:
>>>
>>> Interesting.
>>>
>>> I had also the vague feeling that saveImage was said to be
>>> important when using S4 classes and methods; particularly when
>>> some methods are for generics from a different package/Namespace
>>> and other methods for `base' classes (or other classes defined
>>> elsewhere).
>>> This is the case of 'Matrix', my primary experience here.
>>> OTOH, we now only use 'LazyLoad: yes' , not (any more?)
>>> 'SaveImage: yes' -- and honestly I don't know / remember why.
>>>
>>> Martin
>>>
>>>
>>> Seth> ** preparing package for lazy loading
>>> Seth> Error in makeClassRepresentation(Class, properties, superClasses,
>>> prototype, :
>>> Seth> couldn't find function "getuuid"
>>>
>>> Seth> Looking at the NAMESPACE for the graph package, it looks like it
>>> is
>>> Seth> missing some imports. I added lines:
>>> Seth> import(Ruuid)
>>> Seth> exportClasses(Ruuid)
>>>
>>> Seth> Aside: am I correct in my reading of the extension manual that if
>>> one
>>> Seth> uses S4 classes from another package with a namespace, one
>>> Seth> must import the classes and *also* export them?
>>>
>>> Seth> Now I see this:
>>>
>>> Seth> ** preparing package for lazy loading
>>> Seth> Error in getClass("Ruuid") : "Ruuid" is not a defined class
>>> Seth> Error: unable to load R code in package 'graph'
>>> Seth> Execution halted
>>>
>>> Seth> But Ruuid _is_ defined and exported in the Ruuid package.
>>>
>>> Seth> Is there a known difference in how dependencies and imports are
>>> Seth> handled with LazyLoad as opposed to SaveImage?
>>>
>>> Seth> Thanks,
>>>
>>> Seth> + seth
--
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
More information about the R-devel
mailing list