[EMAIL PROTECTED] wrote: >>>>>> "TimH" == timh <[EMAIL PROTECTED]> >>>>>> on Sat, 5 Jan 2008 02:05:08 +0100 (CET) writes: >>>>>> > > TimH> is() does not catch parent S3 classes: > > >> library(splines) > >> temp <- bs(1:99, df=5) > >> class(temp) > TimH> [1] "bs" "basis" > >> is(temp, "basis") > TimH> [1] FALSE > > TimH> In contrast, is() does catch parent S4 classes: > >> library(copula) > >> norm.cop <- ellipCopula("normal", param = c(0.5, 0.6, 0.7), > TimH> + dim = 3, dispstr = "un") > >> is(norm.cop, "copula") > TimH> [1] TRUE > >> class(norm.cop) > TimH> [1] "normalCopula" > > Yes, that's all correct, but where's the bug? > > S3 has *NO* class definitions, so how can there be class > inheritance? > These types of statements make me really confused (and I suspect far more than necessary). Isn't 'inherits()' an S3 function? (at least it's not in package "methods", and it works with S3 classes, while 'is' is in the "methods" package).
The inherits documentation says: Details: Many R objects have a 'class' attribute, a character vector giving the names of the classes from which the object _inherits_. If the object does not have a class attribute, it has an implicit class, '"matrix"', '"array"' or the result of 'mode(x)' (except that integer vectors have implicit class '"integer"'). (Functions 'oldClass' and 'oldClass<-' get and set the attribute, which can also be done directly.) But if S3 has no class definitions, and that fact precludes class inheritance, how come the inherits() functions exists and works with S3 "classes" and inherits() documentation talks about classes and inheritance? And it looks like 'inherits()' does what (I think) Tim Hesterberg is looking for: > x <- structure(1, class=c("a", "ab", "abc")) > is(x, "a") [1] TRUE > is(x, "ab") [1] FALSE > inherits(x, "a") [1] TRUE > inherits(x, "ab") [1] TRUE > > There's many reasons to go from S3 to S4, and the lack of class > definitions in S3 is an important one... > > Now, still being curious: Are you implicitly saying that in S-plus, > is() behaves differently, namely > ``as if S3 classes would exist?'' (:-) > Is S-PLUS 7.0, I see the following behavior: > x <- structure(1, class=c("a", "ab")) Warning in checkOldClass(c("a", "ab")): No formal definition of old-style inheritance; consider setOldClass(c("a", "ab")) > inherits(x, "a") [1] T > inherits(x, "ab") [1] T > is(x, "a") [1] T > is(x, "ab") [1] T > Which would make it appear that in S-PLUS, for objects with S3 classes the function "is" uses the definition of the concept "inherits" that appears in the R documentation for the function "inherits" :-) (But, apparently, S3 classes don't exist, so does that make R an imaginary language except when one uses S4 classes? :-) -- Tony Plate > [Of course, I understand what you mean, and I agree that > normally, the S3 class attribute c("ch", "pr") means that "ch" > is conceptually a child of "pr". > > However, there's at least one exception in R {which I have found a > bit unfortunate, but never followed up}: > > > class(Sys.time()) > [1] "POSIXt" "POSIXct" > ] > > Regards, > Martin > > TimH> Version: > ..... > TimH> version.string = R version 2.6.1 (2007-11-26) > ..... > > ______________________________________________ > 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