From cgenolin at u-paris10.fr  Fri May  2 16:40:30 2008
From: cgenolin at u-paris10.fr (cgenolin at u-paris10.fr)
Date: Fri, 02 May 2008 16:40:30 +0200
Subject: [Rd] S4: what to put in initialize, validity and constructor?
Message-ID: <20080502164030.pdokyr1q04ogowc4@icare.u-paris10.fr>

Hi the list,

I have some trouble using validity, intialize and the constructor. More 
precisely, what should go where?
Here is a toy exemple (seams long, but the code is very simple):

I want to define an object with two slots a and b with the properties that
b will be either empty or the scare of a. Example of valid object :
  a=  b=
  a=2 b=
  a=3 b=9

So I define my object and the validity function :

setClass(
    "A",
    representation(a="numeric",b="numeric"),
    validity=function(object){
        cat("Validity\n")
        if(length(object at b)!=0){
            if(length(object at a)==0){stop("Can not have empty a and non 
emty b")}else{}
            if(object at a^2!=object at b){stop("b is not the scare of a")}else{}
        }else{}
        return(TRUE)
    }
)

It works:

new("A")
new("A",a=2,b=4)
try(new("A",b=4))
new("A",a=2)
try(new("A",a=2,b=3))


Then I define the initialize function. When b is givent but not a, the 
initialise function set a to sqrt(b).

setMethod(
    "initialize",
    "A",
    function(.Object,a,b){
        if(missing(a)&!missing(b)){
            .Object at b <- b
            .Object at a <- sqrt(b)
        }else{}
        if(!missing(a)&missing(b)){
            .Object at a <- a
        }else{}
        if(!missing(a)&!missing(b)){
            .Object at a <- a
            .Object at b <- b
        }else{}
        validObject(.Object)
	return(.Object)
    }
)

It is fine:

new("A")
new("A",a=2,b=4)
new("A",b=9)
new("A",a=2)
try(new("A",a=2,b=3))


Then I want to set the constructor

A <- function(a,b){
    return(new("A",a,b))
}

But this does not work:
A()
A(a=2,b=4)
A(b=9)
A(a=2)


The following does not work either:

A <- function(a=numeric(),b=numeric()){
    return(new("A",a,b))
}

A()
A(a=2,b=4)
A(b=9)
A(a=2)

So is there a way to define the constructor A without dealing again 
with all the missing&missing staff like in initialize?

Christophe



[Rd] S4: what to put in initialize, validity and constructor?
cgenolin at u-paris10.fr