Dear Seth
Thank you for your comments. Please see my comments and at the end my
corrected code and output.
Sorrowly, the problem remains the same.
Seth Falcon wrote:
> cstrato <[EMAIL PROTECTED]> writes:
>
>
>> Dear all,
>>
>> Maybe, I am doing something wrong, but using R-2.5.0 on my Intel-Mac, I
>> have problems
>> using function callNextMethod() in method initialize.
>>
>> I am loading the following code as file "testS4.R":
>>
>
> I don't think this is the code in the same state as that which you ran
> the examples. Did you add/remove some comment lines perhaps?
>
> After copy/pasting the code you posted, I get:
>
> > tmp<-new("derivedClass")
> [1] "---initialize:derivedClass---"
> [1] "mytitle = MyTitle"
> > tmp<-new("derivedClass",myname="testname",mytitle="testitle")
> [1] "---initialize:derivedClass---"
> [1] "mytitle = MyTitle"
>
>
I am sorry, you are correct, I have commented out ".Object <-
callNextMethod()" in method
initialize for derivedClass afterwards.
>> setValidity("baseClass",
>> function(object) {
>> print("---setValidity:baseClass---")
>> strg <- [EMAIL PROTECTED];
>> if (!(is(strg, "character") && nchar(strg) > 0)) {
>> warning(paste(sQuote("myname"), "is missing"));
>> }#if
>> print(paste("myname = ",[EMAIL PROTECTED]))
>> strg <- [EMAIL PROTECTED];
>> if (!(is(strg, "character") && file.exists(strg))) {
>> warning(paste(sQuote("mydir"), "is not a system directory"));
>> }#if
>> if (substr(strg, nchar(strg), nchar(strg)) == "/") {
>> [EMAIL PROTECTED] <- substr(strg, 0, nchar(strg)-1);
>> }#if
>> print(paste("mydir = ",[EMAIL PROTECTED]))
>> }
>> )#setValidity
>>
>
> Your validity function isn't valid :-P It should either return TRUE or
> return a character vector describing what isn't valid about the
> object. Don't call warning() or print().
>
Please see my corrected code where I use "validMsg()" from BioBase.
> Also, you don't need those ';'
>
> And finally, you are operating on a _copy_ in the validity method
> (just like everywhere else) and so this
>
>
>> if (substr(strg, nchar(strg), nchar(strg)) == "/") {
>> [EMAIL PROTECTED] <- substr(strg, 0, nchar(strg)-1);
>> }#if
>>
>
> will not have any effect on the instance passed in. It is an odd
> thing to do in a validity method.
>
You are right, I moved this code to method "initialize".
> + seth
>
>
Here is my new code "testS4.R" (as used in the output):
setClass("baseClass",
representation(myname = "character",
mydir = "character",
"VIRTUAL"),
prototype(myname = "",
mydir = "")
)#baseClass
setClass("derivedClass",
representation(mytitle = "character"),
contains=c("baseClass"),
prototype(mytitle = "")
)#derivedClass
# taken from package BioBase: tools.R
validMsg <- function(msg, result) {
if (is.character(result)) {
append(msg, result);
} else {
msg;
}#if
}
setMethod("initialize", "baseClass",
function(.Object, ...) {
print("---initialize:baseClass---")
# .Object <- callNextMethod();
strg <- [EMAIL PROTECTED];
print(paste("base:strg = ", strg))
if (strg == "") {
[EMAIL PROTECTED] <- as.character(getwd());
}#if
if (substr(strg, nchar(strg), nchar(strg)) == "/") {
[EMAIL PROTECTED] <- substr(strg, 0, nchar(strg)-1);
}#if
print(paste("base:mydir = ", [EMAIL PROTECTED]))
.Object <- callNextMethod();
.Object;
}
)#initialize
setValidity("baseClass",
function(object) {
print("---setValidity:baseClass---")
msg <- NULL;
strg <- [EMAIL PROTECTED];
if (!(is(strg, "character") && nchar(strg) > 0)) {
msg <- validMsg(msg, paste(sQuote("myname"), "is missing"));
}#if
print(paste("base:myname = ",[EMAIL PROTECTED]))
strg <- [EMAIL PROTECTED];
if (!(is(strg, "character") && file.exists(strg))) {
msg <- validMsg(msg, paste(sQuote("mydir"), "is not a system
directory"));
}#if
print(paste("base:mydir = ",[EMAIL PROTECTED]))
if (is.null(msg)) TRUE else msg;
}
)#setValidity
setMethod("initialize", "derivedClass",
function(.Object, ...) {
print("---initialize:derivedClass---")
# .Object <- callNextMethod();
if ([EMAIL PROTECTED] == "") {
[EMAIL PROTECTED] = "MyTitle";
}#if
print(paste("derived:mytitle = ",[EMAIL PROTECTED]))
.Object <- callNextMethod();
.Object;
}
)#initialize
setValidity("derivedClass",
function(object) {
print("---setValidity:derivedClass---")
msg <- NULL;
strg <- [EMAIL PROTECTED];
if (!(is(strg, "character") && nchar(strg) > 0)) {
msg <- validMsg(msg, paste(sQuote("mytitle"), "is missing"));
}#if
print(paste("derived:mytitle = ",[EMAIL PROTECTED]))
if (is.null(msg)) TRUE else msg;
}
)#setValidity
Here is the new output with the same error:
> library(methods)
> source("testS4.R")
> tmp<-new("derivedClass")
[1] "---initialize:derivedClass---"
[1] "derived:mytitle = MyTitle"
[1] "---initialize:baseClass---"
[1] "base:strg = "
[1] "base:mydir = /Volumes/CoreData/CRAN/Workspaces/tests"
>
> tmp<-new("derivedClass",myname="testname",mydir="",mytitle="testitle")
[1] "---initialize:derivedClass---"
[1] "derived:mytitle = MyTitle"
[1] "---initialize:baseClass---"
[1] "base:strg = "
[1] "base:mydir = /Volumes/CoreData/CRAN/Workspaces/tests"
[1] "---setValidity:baseClass---"
[1] "base:myname = testname"
[1] "base:mydir = "
Error in validObject(.Object) : invalid class "derivedClass" object:
'mydir' is not a system directory
I do not understand why "mydir" is not recognized correctly?
Thank you
Christian
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel