[Rd] [R] type converters not being saved to workspace
Prof Brian Ripley
ripley at stats.ox.ac.uk
Wed Apr 12 08:28:35 CEST 2006
On Tue, 11 Apr 2006, John Chambers wrote:
> (diverted to r-devel)
>
> The problem seems to be rather that loading of the saved image takes place
> _after_ the packages are attached. So nothing that the methods package does
> in its initialization will see the relevant type converters or other methods
> objects.
I am sorry, but that is not the case: see ?Startup. The image is loaded
_before_ the packages are attached (as documented). You can check
explicitly by
env R_DEFAULT_PACKAGES=NULL R --restore
# R starts and loads the workspace
> library(methods)
and it still does not work (as I had tried before answering).
> More generally, loading into .GlobalEnv will never cause the equivalent of
> cacheMetaData(.GlobalEnv).
>
> It would be possible to hack the C code in main/saveload.c to generate a call
> to cacheMetaData under the right circumstances, but is that the best
> solution?
> Intuitively, it's the objects containing the method/class definitions that
> should trigger actions when they are loaded (emulating what happens when the
> corresponding setMethod or setClass function call takes place). I.e., a load
> method for these classes of objects. Possible?
Yes, but it will not help here as the objects are loaded without methods
being loaded.
I hope one day when we have S4 objects marked in the object headers that
loading such an object will load and attach the methods package.
> It might be better, now that we're past feature freeze, to leave this as a
> "design infelicity" for the upcoming release.
Definitely.
I think that package methods needs to cache metadata in its .onAttach not
.onLoad. In principle it affects anything setting methods for generics in
package:methods, but if this is done in a package, the dependency on
methods will ensure that methods is loaded before the package, and then
library() will run cacheMetaData on the package.
> Prof Brian Ripley wrote:
>
>> It is recommended that you use a package for this sort of thing.
>>
>> When a package is loaded, the S4 methods it contains are merged into the
>> metadata. When the global environment is loaded, they are not. Call
>> 'cacheMetaData(1)' to do so.
>>
>> [This looks like a bug: cacheMetaData is called on .GlobalEnv in the
>> startup code for package methods, but seems not to work when called from
>> there. I think this is because package methods is not at that point on the
>> search path (the call is from .onLoad) and hence the coerce() generic is
>> not visible to cacheMetaData. If you have S4 code in a package, it will
>> ensure that package methods is attached before your package is loaded.]
>>
>> On Sun, 9 Apr 2006, Joseph Wang wrote:
>>
>>> Any one can explain why this happens or any work arounds?
>>>
>>>> setClass('foo')
>>>
>>> [1] "foo"
>>>
>>>> setAs('foo', 'character', function(from) from)
>>>> showMethods('coerce')
>>>
>>>
>>> Function "coerce":
>>> from = "ANY", to = "array"
>>> from = "ANY", to = "call"
>>> from = "ANY", to = "character"
>>> from = "ANY", to = "complex"
>>> from = "ANY", to = "environment"
>>> from = "ANY", to = "expression"
>>> from = "ANY", to = "function"
>>> from = "ANY", to = "integer"
>>> from = "ANY", to = "list"
>>> from = "ANY", to = "logical"
>>> from = "ANY", to = "matrix"
>>> from = "ANY", to = "name"
>>> from = "ANY", to = "numeric"
>>> from = "ANY", to = "single"
>>> from = "ANY", to = "ts"
>>> from = "ANY", to = "vector"
>>> from = "ANY", to = "NULL"
>>> from = "foo", to = "character"
>>>
>>>> q()
>>>
>>> Save workspace image? [y/n/c]: y
>>>
>>>
>>> (restart)
>>>
>>>> showMethods('coerce')
>>>
>>>
>>> Function "coerce":
>>> from = "ANY", to = "array"
>>> from = "ANY", to = "call"
>>> from = "ANY", to = "character"
>>> from = "ANY", to = "complex"
>>> from = "ANY", to = "environment"
>>> from = "ANY", to = "expression"
>>> from = "ANY", to = "function"
>>> from = "ANY", to = "integer"
>>> from = "ANY", to = "list"
>>> from = "ANY", to = "logical"
>>> from = "ANY", to = "matrix"
>>> from = "ANY", to = "name"
>>> from = "ANY", to = "numeric"
>>> from = "ANY", to = "single"
>>> from = "ANY", to = "ts"
>>> from = "ANY", to = "vector"
>>> from = "ANY", to = "NULL"
>>> from = "NULL", to = "OptionalFunction"
>>>
>>>>
>>>
>>> ______________________________________________
>>> R-help at stat.math.ethz.ch mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide!
>>> http://www.R-project.org/posting-guide.html
>>>
>>
>
>
--
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