FAQ
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}}

Search Discussions

  • John Chambers at Feb 11, 2009 at 7:46 pm
    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
  • John Chambers at Feb 11, 2009 at 8:39 pm
    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
  • Sklyar, Oleg (London) at Feb 12, 2009 at 9:22 am
    Hi John,

    sorry for not posting more info. Strangely I get warnings about
    setClassUnion with numeric in a very special case: if I define it in a
    clean R session then there are no warnings, however if I load a number
    of my packages where there are other classes derived from numeric and
    exported then I get the following warnings:
    setClassUnion("numericOrNULL", c("numeric","NULL"))
    [1] "numericOrNULL"
    Warning messages:
    1: In .checkSubclasses(class1, classDef, class2, classDef2, where1, :
    Subclass "TimeDateBase" of class "numeric" is not local and cannot be
    updated for new inheritance information; consider setClassUnion()
    2: In .checkSubclasses(class1, classDef, class2, classDef2, where1, :
    Subclass "TimeDate" of class "numeric" is not local and cannot be
    updated for new inheritance information; consider setClassUnion()
    3: In .checkSubclasses(class1, classDef, class2, classDef2, where1, :
    Subclass "Time" of class "numeric" is not local and cannot be updated
    for new inheritance information; consider setClassUnion()

    The class is operational even with those warnings though. Now, the above
    classes are defined as follows:

    ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    setClass("TimeDateBase",
    representation("numeric", mode="character"),
    prototype(mode="posix")
    )

    ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    setClass("TimeDate",
    representation("TimeDateBase", tzone="character"),
    prototype(tzone="Europe/London")
    )

    ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    setClass("Time",
    representation("TimeDateBase")
    )

    Theses classes work perfectly fine on their own and are used throughout
    our code for all possible time and date operations extending the
    existing functionality of R and available third party packages by an
    order of magnitude. I do not see a relation between the above class
    definitions and the newly defined class union though apart from the fact
    that they are in a package namespace and therefore locked. Sorry I
    cannot provide more source code as the code is not yet public.

    It would definitely be nice to somehow have a .Data slot in NULL or even
    a data.frame, although I do understand that this is quite a substantial
    piece of work to make it all robust and backward compatible.
    sessionInfo() ## of a clean session
    R version 2.9.0 Under development (unstable) (2009-02-02 r47821)
    x86_64-unknown-linux-gnu

    locale:
    C

    attached base packages:
    [1] stats graphics utils datasets grDevices methods base


    Any thoughts are greatly appreciated.

    Kind regards,
    Oleg

    Dr Oleg Sklyar
    Research Technologist
    AHL / Man Investments Ltd
    +44 (0)20 7144 3107
    osklyar at maninvestments.com
    -----Original Message-----
    From: John Chambers [mailto:jmc at r-project.org]
    Sent: 11 February 2009 20:40
    To: Sklyar, Oleg (London)
    Cc: r-devel at r-project.org
    Subject: Re: [Rd] setClassUnion with numeric; extending class union

    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
    **********************************************************************
    Please consider the environment before printing this email or its attachments.
    The contents of this email are for the named addressees ...{{dropped:19}}

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupr-devel @
categoriesr
postedFeb 11, '09 at 12:25p
activeFeb 12, '09 at 9:22a
posts4
users2
websiter-project.org
irc#r

People

Translate

site design / logo © 2022 Grokbase