Re: [Rd] setClassUnion with numeric; extending class union

From: John Chambers <jmc_at_r-project.org>
Date: Wed, 11 Feb 2009 12:39:50 -0800

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
>



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed 11 Feb 2009 - 19:47:45 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 12 Feb 2009 - 09:30:21 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive