[Rd] S4 Inheritance of environments

John Chambers jmc at r-project.org
Mon Apr 26 00:38:54 CEST 2010


In addition to Duncan Murdoch's explanation, this is discussed in the 
documentation for "Classes" (briefly):
.....

Extending a basic type this way allows objects to use old-style code for 
the corresponding type as well as S4 methods. Any basic type can be used 
for .Data, but a few types are treated differently because they do not 
behave like ordinary objects; for example, "NULL", environments, and 
external pointers. Classes extend these types by using a specially named 
slot, itself inherited from an internally defined S4 class. Inheritance 
from the nonstandard object type then requires an actual computation, 
rather than the "simple" inclusion for other types and classes. The 
intent is that programmers will not need to take account of the 
mechanism, but one implication is that you should not explicitly use the 
type of an S4 object that extends an arbitrary object type. Use is and 
similar functions instead.

.......


The code for is.environment() is presumably using the type, whereas 
inherits() takes account of the indirect mechanism.

Generally, you should be able to deal with inheritance from environments 
in a natural way.

John


On 4/24/10 10:15 AM, 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.
>
> 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
>



More information about the R-devel mailing list