Ulrike Grömping
2007-Mar-23 12:13 UTC
[Rd] Bug in str or issue with class management in my package?
Dear developeRs, with R 2.4.1 (and also 2.4.0), the function str() fails on objects of class relimplmbooteval, if there are unused slots, which is very often the case. I am not sure whether this is a bug in str() or a correct behavior of str() that unmasks some sloppiness in my usage of S4 classes (that I am not aware of)? Reproducible example (package relaimpo needed): The program require(relaimpo) bte<-booteval.relimp(boot.relimp(swiss,b=100)) str(bte) yields the error message Errorr in FUN(c("lmg.lower", "lmg.upper", "lmg.rank.lower", "lmg.rank.upper", : no slot named "pmvd.lower" for this object of class "relimplmbooteval" (back-translated from German). Regards, Ulrike -- View this message in context: http://www.nabble.com/Bug-in-str-or-issue-with-class-management-in-my-package--tf3453429.html#a9633559 Sent from the R devel mailing list archive at Nabble.com.
Martin Morgan
2007-Mar-23 13:01 UTC
[Rd] Bug in str or issue with class management in my package?
Ulrike, booteval.relimp has the statement ausgabe <- calc.relimp(empcov, type = type, diff = diff, rank = rank, rela = rela, always = always, groups = groups, groupnames = groupnames) class(ausgabe) <- "relimplmbooteval" This changes the name of the class of ausgabe, without changing its structure. I'm guessing that prior to this call ausgabe did not have a slot "pmvd.lower". Here's the simpler version:>setClass("A", representation=representation(x="numeric"))[1] "A"> setClass("B", contains="A", representation=representation(y="numeric"))[1] "B"> a <- new("A") > class(a) <- "B" > str(a)Error in FUN(c("y", "x")[[1L]], ...) : no slot of name "y" for this object of class "B" and some behavior which is somehow weird:> slot(a, "y")Error in slot(a, "y") : no slot of name "y" for this object of class "B"> slot(a, "y") <- 10 # 'creates' the slot! > slot(a, "y")[1] 10 Probably what you want to do is to create a 'setAs' method setAs('relimplm', 'relimplmbooteval', function(from) { <your code here, e.g.,> }) and use ausgabe <- as(ausgabe, "relimplmbooteval") I'm not really sure what <your code here> should look like; my first stab was obj <- new("relimplmbooteval") slots <- slotNames(from) for (slt in slots) slot(obj, slt) <- slot(from, slt) obj which would not be very memory efficient (each slot assignment copies the entire object) but is perhaps fine for your needs. Hope that helps Martin Ulrike Gr?mping <groemp at tfh-berlin.de> writes:> Dear developeRs, > > with R 2.4.1 (and also 2.4.0), the function str() fails on objects of class > relimplmbooteval, if there are unused slots, which is very often the case. I > am not sure whether this is a bug in str() or a correct behavior of str() > that unmasks some sloppiness in my usage of S4 classes (that I am not aware > of)? > > Reproducible example (package relaimpo needed): > > The program > > require(relaimpo) > bte<-booteval.relimp(boot.relimp(swiss,b=100)) > str(bte) > > yields the error message > > Errorr in FUN(c("lmg.lower", "lmg.upper", "lmg.rank.lower", > "lmg.rank.upper", : > no slot named "pmvd.lower" for this object of class > "relimplmbooteval" > (back-translated from German). > > Regards, Ulrike > -- > View this message in context: http://www.nabble.com/Bug-in-str-or-issue-with-class-management-in-my-package--tf3453429.html#a9633559 > Sent from the R devel mailing list archive at Nabble.com. > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel-- Martin Morgan Bioconductor / Computational Biology http://bioconductor.org