Re: [Rd] Inherited S4 .Data prototype not assigned

From: Oleg Sklyar <osklyar_at_ebi.ac.uk>
Date: Thu, 03 May 2007 23:37:34 +0100

Martin, thanks for commenting on the issue. I did not know if this was a "feature" and therefore did not post before, but:

in EBImage, BioC, the class Image is derived from array and since recently (R2.5) I had a problem with the following constructor: new("Image", .Data=data). Finally I had to do res <- new("Image"); res@.Data <- dat, which worked.

However, what I have problem with, is that R does not have a concept of public, private or protected members. Therefore I do not really see why .Data should be hidden and why then now and not initially. If this goes on this way and there will be no direct access to it, it will simply break my whole package.

Best,
Oleg

Martin Morgan wrote:
> An S4 class inheriting from another class with a prototype does not
> inherit (at least sometimes) the prototype for .Data:
>

>> setClass("A", "numeric", 1)
>> setClass("B", "A")
>> new("A")

> An object of class "A"
> [1] 1
>> new("B")

> An object of class "B"
> numeric(0)
>
> My expectation is that prototype inheritance of .Data behaves as for
> regular slots:
>
>> setClass("A",

> + representation=representation(x="numeric"),
> + prototype=prototype(x=1))
> [1] "A"
>> setClass("B", "A")

> [1] "B"
>> new("B")

> An object of class "B"
> Slot "x":
> [1] 1
>
> I think this traces first to an errant ! that claims the data part is
> filled, when it is not yet, and second to a call to getDataPart with a
> primitive that occupies, but does not have, a .Data slot.
>
> Martin
>
> --- src/library/methods/R/RClassUtils.R (revision 41426)
> +++ src/library/methods/R/RClassUtils.R (working copy)
> @@ -45,7 +45,7 @@
> ## try for a single superclass that is not virtual
> supers <- names(extends)
> virtual <- NA
> - dataPartDone <- length(slots)==0 || !is.na(match(".Data", snames))
> + dataPartDone <- length(slots)==0 || is.na(match(".Data", snames))
> dataPartClass <- if(dataPartDone) "ANY" else elNamed(slots, ".Data")
> prototype <- ClassDef_at_prototype
> ## check for a formal prototype object (TODO: sometime ensure that this happens
> @@ -79,8 +79,15 @@
> else if(length(slots) > 0) {
> for(slotName in slotsi) {
> if(identical(slotName, ".Data")) {
> - if(!dataPartDone) {
> - prototype <- setDataPart(prototype, getDataPart(pri))
> + if (!dataPartDone) {
> + temp <- getClass(class(pri))@slots
> + if (length(temp)==0 ||
> + is.na(match(".Data", names(temp)))) {
> + prototype <- pri
> + attributes(prototype) <- NULL
> + } else
> + prototype <-
> + setDataPart(prototype, getDataPart(pri))
> dataPartDone <- TRUE
> }
> }
>> sessionInfo()

> R version 2.6.0 Under development (unstable) (2007-05-03 r41426)
> x86_64-unknown-linux-gnu
>
> locale:
> LC_CTYPE=en_US;LC_NUMERIC=C;LC_TIME=en_US;LC_COLLATE=en_US;LC_MONETARY=en_US;LC_MESSAGES=en_US;LC_PAPER=en_US;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US;LC_IDENTIFICATION=C
>
> attached base packages:
> [1] "stats" "graphics" "grDevices" "utils" "datasets" "methods"
> [7] "base"

>
-- 
Dr Oleg Sklyar | EBI-EMBL, Cambridge CB10 1SD, UK | +44-1223-494466

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Thu 03 May 2007 - 22:39:33 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 Fri 04 May 2007 - 06:34:19 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.