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
oskl...@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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to