Hi Michael -- sorry not to respond sooner.

The lessons in the StackOverflow post were learned by the mistakes in Biobase; 
many of the classes there fail to follow its advice. Also, there are a number 
of packages in Bioconductor that depend on the existing Biobase formulation. 
Unfortunately, the inertia here is strong.

A work-around might be to write an initialize method for "A" that uses 
callNextMethod() with an argument versions=, thereby freeing up ... for copy 
construction.

The S4Vectors infrastructure is in many ways a better starting point for new 
class development.

Martin 
________________________________________
From: Bioc-devel [[email protected]] on behalf of Stravs, 
Michael [[email protected]]
Sent: Thursday, January 07, 2016 10:41 AM
To: [email protected]
Subject: [Bioc-devel] Versioned (Biobase) "initialize" method

Hi,

The "initialize" method of the Versioned class in Biobase is defined in a way 
that breaks when inheriting classes want to define a copy constructor.

Code to reproduce:

library(Biobase)
setClass("A",
         representation = representation(var1="integer"),
         prototype=prototype(var1=integer(),
                             new("Versioned", versions=c(A = "0.1.0"))),
         contains="Versioned")

ia <- new("A")
ia2 <- new("A", ia)
# "ia" is mapped to the argument "versions" of the Versioned "initialize" 
method!

Full gist snippet including bugfix:
https://gist.github.com/meowcat/c51a4260fb710e2fa51a

For explanation, see:
http://stackoverflow.com/questions/16247583/inheritance-in-r/16248773#16248773

The Versioned class in Biobase has the following "initialize" method:

function (.Object, ...)
{
    .local <- function (.Object, versions = list(), ...)
    {
        .Object <- callNextMethod(.Object, ...)
        classVersion(.Object)[names(versions)] <- versions
        .Object
    }
    .local(.Object, ...)
}

Can you change it as follows:


function (.Object, ...)

{

    .local <- function (.Object, ..., versions = list())

    {

        .Object <- callNextMethod(.Object, ...)

        classVersion(.Object)[names(versions)] <- versions

        .Object

    }

    .local(.Object, ...)

}

This will fix the problem.


Michael Stravs
Eawag
Umweltchemie
BU E 23
�berlandstrasse 133
8600 D�bendorf
+41 58 765 6742


        [[alternative HTML version deleted]]


This email message may contain legally privileged and/or confidential 
information.  If you are not the intended recipient(s), or the employee or 
agent responsible for the delivery of this message to the intended 
recipient(s), you are hereby notified that any disclosure, copying, 
distribution, or use of this email message is prohibited.  If you have received 
this message in error, please notify the sender immediately by e-mail and 
delete this email message from your computer. Thank you.
_______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to