> -----Original Message----- > From: Prof Brian Ripley [mailto:[EMAIL PROTECTED] > Sent: den 25 oktober 2003 18:01 > To: Henrik Bengtsson > Cc: 'Eryk Wolski'; [EMAIL PROTECTED] > Subject: RE: [R] Whats wrong with NextMethod("[[<-")? > > > On Sat, 25 Oct 2003, Henrik Bengtsson wrote: > > > Hi. NextMethod("[[<-") do indeed call the "next" "[[<-"() > method. The > > thing is that it is also return the update object, which > you are *not* > > taking care of. You are just returning the same object > again. So here > > is what you want: > > > > "[[<-.myA"<-function(mvl,name,value) { > > if(data.class(value) == "myB") { > > mvl$data[[name]] <- value > > mvl > > } else { > > NextMethod("[[<-") > > } > > } > > > > Also, it is better to use data.class(obj) than class(obj)[1]. > > It's not. First, the effect is the same here, and second > data.class is really only for back-compatibility when fudging the > difference between "numeric" and "integer".
I didn't really know that. Thanks for that comment. > It is almost certainly better to use inherits(value, "myB"), > though, and you should probably very rarely test the class > (let alone data.class) directly. Of course! ...and to extend what Brian Ripley write: you rarely want to do an action *if and only if* an object is of a specific class and another action if it is of a subclass or a superclass. This would in some would be against why you have choose the class hierarchy that chose. So inherits() should be used. Henrik "too-little-sleep" Bengtsson > > Cheers > > > > Henrik Bengtsson > > Lund University > > > > > > > -----Original Message----- > > > From: [EMAIL PROTECTED] > > > [mailto:[EMAIL PROTECTED] On Behalf Of Eryk Wolski > > > Sent: den 25 oktober 2003 16:27 > > > To: [EMAIL PROTECTED] > > > Subject: [R] Whats wrong with NextMethod("[[<-")? > > > > > > > > > Hi! > > > > > > Given a list object "myA" with several fields > > > i want to construct the assignment function "[[<-.myA" > which behaves > > > differently dependent of the class of the arguments (value). > > > > > > If value are a myB object it should append(assign) this > > > massvector to the data field of myA object if its any other > > > object the assignement function should work as for any list. > > > > > > > > > "[[<-.myA"<-function(mvl,name,value) > > > { > > > if(class(value)[1]!="myB") > > > { > > > NextMethod("[[<-"); #work as a list > > > } > > > else > > > { > > > mvl$data[[name]] <- value #work as myA > > > } > > > mvl > > > } > > > > > > > > > test<-list(a=1,data=list(1)) > > > class(test)<-c("myA","list") > > > > > > duda<-"hello" > > > class(duda)<-"myB" > > > > > > test[[2]]<-duda #works > > > test[["newField"]]<-"bella" #nothing happens!!! > > > > > > The assignment test[["newField"]]<-"bella" has no effect. The > > > list test are not extended by the entry newField. Looks to me > > > like NextMethod("[[<-") does nothing. > > > > > > Is it possible to do this what I try to do with S3? > > > If so what i do wrong? > > > If its not possible to do this in this way can anyone suggest a > > > different solution to what i like to do? > > > > > > Eryk > > > > > > ______________________________________________ > > > [EMAIL PROTECTED] mailing list > > > https://www.stat.math.ethz.ch/mailma> n/listinfo/r-help > > > > > > > > > > ______________________________________________ > > [EMAIL PROTECTED] mailing list > > https://www.stat.math.ethz.ch/mailman/listinfo/r-help > > > > > > -- > Brian D. Ripley, [EMAIL PROTECTED] > Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ > University of Oxford, Tel: +44 1865 272861 (self) > 1 South Parks Road, +44 1865 272866 (PA) > Oxford OX1 3TG, UK Fax: +44 1865 272595 ______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help
