[Rd] S4 Inheritance of environments

Henrik Bengtsson hb at stat.berkeley.edu
Sun Apr 25 14:00:54 CEST 2010


On Sun, Apr 25, 2010 at 1:09 PM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote:
> On 24/04/2010 1:15 PM, Christopher Brown wrote:
>>
>> I looked through the documentation and the mailing lists and could not
>> find an answer to this.  My apologies if it has already been answered.
>>  If it has, a pointer to the relevant discussion would be greatly
>> appreciated.
>>
>
> Environments are unusual in that they are reference objects:  if e is an
> environment, and you assign f <- e, then f refers to the same object as e
> does.  This is unusual in R, where most objects are copied on assignment
> (logically, not always physically).  It means that attributes on
> environments behave strangely:  if you put an attribute on e and remove the
> same attribute from f, it is gone from e too.  We've discussed removing the
> possibility of putting attributes on environments (just as you can't put
> attributes on NULL), but haven't done so yet.
>
> What you should do if you want to use an environment in the way you're using
> it is to put it in a container.  For S4, that could mean using an
> environment as a slot, or inheriting from an object like list(e), rather
> than directly from e.

I can confirm these reported issues.  FYI, what Duncan is suggesting
is exactly the design behind the Object class (encapsulates an
environment) in the R.oo package.  The difference is that it is
working with S3.  It's been working flawlessly for > 9 years.  Others
have had idea to do the same but with S4, but I'm not sure if that
ever took of.

/Henrik
(R.oo author)
>
> Duncan Murdoch
>>
>> Creating S4 classes containing environments exhibits unexpected
>> behavior/features.  These have a different in two ways:
>>
>> 1) slotName for the data: ".xData" instead of ".Data" and do not respond
>> to the
>> 2) Response to the is.* function seems to indicate that the object
>> does not know of its inheritance.  ( Notably, the inherits function
>> works as expected. )
>>
>> Here is a working illustration:
>>
>>
>>>
>>> #  LIST
>>> setClass( 'inheritList', contains='list')
>>>
>>
>> [1] "inheritList"
>>
>>>
>>> inList <- new( 'inheritList' )
>>> class( inList )
>>>
>>
>> [1] "inheritList"
>> attr(,"package")
>> [1] ".GlobalEnv"
>>
>>>
>>> is.list( inList )          # TRUE
>>>
>>
>> [1] TRUE
>>
>>>
>>> slotNames(inList)          # ".Data"
>>>
>>
>> [1] ".Data"
>>
>>>
>>> inherits(inList, 'list' )  # TRUE
>>>
>>
>> [1] TRUE
>>
>>>
>>> # ENVIRONMENT
>>> setClass( 'inheritEnv', contains='environment' )
>>>
>>
>> Defining type "environment" as a superclass via class ".environment"
>> [1] "inheritEnv"
>>
>>>
>>> inEnv <- new( 'inheritEnv' )
>>> class(inEnv)
>>>
>>
>> [1] "inheritEnv"
>> attr(,"package")
>> [1] ".GlobalEnv"
>>
>>>
>>> is.environment(inEnv)             # FALSE
>>>
>>
>> [1] FALSE
>>
>>>
>>> slotNames(inEnv)                  # ".xData"
>>>
>>
>> [1] ".xData"
>>
>>>
>>> inherits(inEnv, 'environment' )   # TRUE
>>>
>>
>> [1] TRUE
>>
>> My questions is whether this behavior is a bug? By design?  A work
>> around?  Etc.?
>>
>> Thanks kindly for your reply,
>>
>> Chris
>>
>>
>> the Open Data Group
>>  http://www.opendatagroup.com
>>  http://blog.opendatagroup.com
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



More information about the R-devel mailing list