[Rd] S4: what to put in initialize, validity and constructor?
cgenolin at u-paris10.fr
cgenolin at u-paris10.fr
Fri May 2 16:40:30 CEST 2008
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
More information about the R-devel
mailing list