From jmc at r-project.org  Wed Feb 11 21:39:50 2009
From: jmc at r-project.org (John Chambers)
Date: Wed, 11 Feb 2009 12:39:50 -0800
Subject: [Rd] setClassUnion with numeric; extending class union
In-Reply-To: <49932B2E.5090703@r-project.org>
References: <1A68FCB28DE72F4BA3B967E6506CCE43047DF65F@mildnpexmb01.maninvestments.ad.man.com>
	<49932B2E.5090703@r-project.org>
Message-ID: <49933796.60809@r-project.org>

So, I was intrigued and played around a bit more.  Still can't get any 
warnings, but the following may be the issue.

One thing NOT currently possible is to have a class that has NULL as its 
data part, because type NULL is abnormal and can't have attributes.

So if you want a class that contains a union including NULL, you're in 
trouble generating a value from the class that is NULL.  It's not really 
a consequence of the setUnion() per se.

 > setClass("bar", contains = "numericOrNULL")
[1] "bar"
 > zz = new("bar", NULL)
Error in validObject(.Object) :
  invalid class "bar" object: invalid object for slot ".Data" in class 
"bar": got class "list", should be or extend class "numericOrNULL"

(How one got from the error to the message is a question, but in any 
case this can't currently work.)

As in my example and in your example with a slot called "data", no 
problem in having a slot value that is NULL.

Looking ahead, I'm working on some extensions that would allow classes 
to contain "abnormal" data types (externalptr, environment, ...) by 
using a reserved slot name, since one can not make the actual data type 
one of those types.

John Chambers wrote:
> What warnings? Which part of the following is not what you're looking 
> for? (The usual information is needed, like version of R, reproducible 
> example, etc.)
>
>
> > setClassUnion("numericOrNULL", c("numeric","NULL"))
> [1] "numericOrNULL"
> > setClass("foo", representation(x="numericOrNULL"))
> [1] "foo"
> > ff = new("foo", x= 1:10)
> > fg = new("foo", x = NULL)
> >
> > ff
> An object of class ?foo?
> Slot "x":
> [1] 1 2 3 4 5 6 7 8 9 10
>
> > fg
> An object of class ?foo?
> Slot "x":
> NULL
> > fk = new("foo")
> > fk
> An object of class ?foo?
> Slot "x":
> NULL
>
> John
>
> Sklyar, Oleg (London) wrote:
>> Dear list:
>>
>> I am looking for a good way to create an S4 class that would extend
>> numeric, but would allow NULL instead of data as well. As far as I can
>> see there is no way at the moment to do that, but please correct me if I
>> am wrong. The best solution I came up with so far was the following (it
>> also indicates a problem of using setClassUnion with numeric as one of
>> the classes):
>>
>> I define a class union of numeric and NULL:
>>
>> Unfortunately the following works only with warnings:
>> setClassUnion("numericOrNULL", c("numeric","NULL"))
>>
>> So I do a workaround as:
>>
>> setClass("aNumeric", contains="numeric")
>> setClassUnion("numericOrNULL", c("aNumeric","NULL"))
>>
>> Then I cannot really extend the above virtual class and can only use it
>> in a user-defined slot as follows:
>>
>> setClass("myClass", representation(data="numericOrNULL"))
>> new("myClass", data=runif(20))
>> new("myClass", data=NULL)
>>
>> and this works.
>>
>> Obviously it would be nicer to have something like the following:
>>
>> setClass("myClass", contains="numericOrNULL")
>> new("myClass", runif(20)) ## .Data is not a slot of myClass
>> setClass("myClass", representation("numericOrNULL"))
>> new("myClass", runif(20)) ## ibid
>>
>> Technically I understand that the reason behind it failing to work is
>> that the virtual class numericOrNULL has not got the .Data slot from
>> numeric, but it would be nice to have such a functionality.
>>
>> Any ideas about better ways for solving such a problem than the one
>> described above?
>>
>> Thanks.
>>
>> Best,
>> Oleg
>>
>> Dr Oleg Sklyar
>> Research Technologist
>> AHL / Man Investments Ltd
>> +44 (0)20 7144 3107
>> osklyar at maninvestments.com
>>
>> **********************************************************************
>> Please consider the environment before printing this email or its 
>> attachments.
>> The contents of this email are for the named addressees 
>> ...{{dropped:19}}
>>
>> ______________________________________________
>> 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
>



[Rd] setClassUnion with numeric; extending class union
John Chambers