I'll look at this in more detail (though not for a few days), but the essence I think is that nothing in the current version allows one to say the S3 equivalent of
setClass("VCorpus", contains = "list", ....) Seems a (minor, I hope) glitch that what Martin K. tried didn't work: setOldClass(c("VCorpus", "Corpus", "list")) As far as I can see, setOldClass() should understand the basic data types as valid superclasses. Martin Morgan's code is indeed a workaround. And as Martin Maechler commented, the intention is to make S3 and S4 classes play together as much as possible. Morgan wrote: > Hi Martin Kober -- > > Martin Kober wrote: > >> Hello, >> >> I am the maintainer of the stringkernels package and have come across >> a problem with using S3 objects in my S4 classes. >> >> Specifically, I have an S4 class with a slot that takes a text corpus >> as a list of character vectors. tm (version 0.5) saves corpora as >> lists with a class attribute of c("VCorpus", "Corpus", "list"). I >> don't actually need the class-specific attributes, I only care about >> the list itself. >> >> Here's a simplified example of my problem: >> >> >>> setClass("testclass", representation(slot="list")) >>> >> [1] "testclass" >> >>> a = list(a="1", b="2") >>> class(a) = c("VCorpus", "Corpus", "list") # same as corpora in tm v0.5 >>> > > This has the feel of a workaround, but > > setOldClass(class(a)[1:2]); setIs("Corpus", "list") > > helps here, first registering c('vCorpus', 'Corpus') as an S3 hierarchy > and then defining the relationship between the root of the hierarchy and > (the S4 class) 'list'. > > Martin (Morgan) > > >>> x = new("testclass", slot=a) >>> >> Error in validObject(.Object) : >> invalid class "testclass" object: 1: invalid object for slot "slot" >> in class "testclass": got class "VCorpus", should be or extend class >> "list" >> invalid class "testclass" object: 2: invalid object for slot "slot" in >> class "testclass": got class "Corpus", should be or extend class >> "list" >> invalid class "testclass" object: 3: invalid object for slot "slot" in >> class "testclass": got class "list", should be or extend class "list" >> >> The last line is a bit confusing here (``got class "list", should be >> or extend class "list"''). There's an even more confusing error >> message when I try to assign the slot later on: >> >> >>> y = new("testclass") >>> y...@slot = a >>> >> Error in checkSlotAssignment(object, name, value) : >> c("assignment of an object of class \"VCorpus\" is not valid for >> slot \"slot\" in an object of class \"testclass\"; is(value, \"list\") >> is not TRUE", "assignment of an object of class \"Corpus\" is not >> valid for slot \"slot\" in an object of class \"testclass\"; is(value, >> \"list\") is not TRUE", "assignment of an object of class \"list\" is >> not valid for slot \"slot\" in an object of class \"testclass\"; >> is(value, \"list\") is not TRUE") >> >> The last part of the message claims that ``is(value, "list") is not >> TRUE'', but is(a, "list") is certainly TRUE. (??) >> >> On a side note, it does work when "list" is the first entry in class(). >> >> >> I tried to use setOldClass, but seemingly using list is not possible >> because it does not extend oldClass, or I didn't find out how to do >> it: >> >>> setOldClass(c("VCorpus", "Corpus", "list")) >>> >> Error in setOldClass(c("VCorpus", "Corpus", "list")) : >> inconsistent old-style class information for "list"; the class is >> defined but does not extend "oldClass" >> >> >> Intuitively I would have thought that, because the underlying data is >> of type list, it would "fit" into an object slot requiring a list, >> irrespective of S3 class attributes. The only thing I can think of is >> a manual solution removing the class attribute. >> >> Is there a way to define lists with S3 class attributes such that they >> are accepted as lists in S4 object slots? Or any other ways to solve >> this? >> >> >> Thanks in advance >> Best Regards >> Martin >> >> ______________________________________________ >> R-devel@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel