Abs, Inline.
On Thu, Mar 28, 2019 at 8:10 PM Abs Spurdle <spurdl...@gmail.com> wrote: > I know I said that I had no further comments on object oriented semantics. > However, I found a contradiction in the R documentation. > > > Gabriel Becker wrote: > > So, there are implicit classes, but *only when the data object is NOT an > "R object" > > In the R Language Definition: > > The R specific function typeof returns the type of an R object. > > Lists have elements, each of which can contain any type of R object > > Symbols refer to R objects. > > Unlike most other R objects, environments are not copied > > So, according the the R Language Defintion, all objects in R, are R > objects. > > However, in the help page for UseMethod(), which you've already mentioned: > > An R object is a data object which has a class attribute (and this can > be tested by is.object). > > So, according to this, an object in R, isn't necessarily an R object. > > These are contradictory to each other. > And I believe that the R Language Definition is correct. > So, the help page for UseMethod() should be changed to match the language > definition. > This could be changed, but it seems largely semantic. Its clear from the UseMethod documentation that it has a specific definition of "R Object", that it explicitly defines, that it will use throughout that piece of documentation. Unfortunate, perhaps, but clearly scoped and unambiguous, in my opinion. Also, note that if this was changed, its the documentation that would be changed, to simply use, for example "classed object" instead of "R Object". The behavior would be identical and would not change so that all "R objects" (in the language definition sense) would be treated the same by S3 dispatch. > > Hadley Wickham wrote: > > Understanding the distinction between base types and S3 classes > > is very important to make this sort of question precise > > Note that the R Language Definition does not mention either "base types" > or "S3 classes". > So, should I be understanding *your* distinction between them? > They are not Hadley's distinction, or mine. We (he in more detail and covering the corner cases like internal and group generics better) are describing to you how the system actually works, and why you got the results which so surprised you. I think we've done so at this point however, and your phrasing makes it seem like you're looking for an argument, which I (and I suspect others on this list) have no interest in, rather than to learn, which I was happy to try to help you with, so with respect I'll not be engaging you more on this topic. > > Martin Maechler wrote: > > I do agree with Gabe that (in some cases), using > > formal (aka "S4") classes is really what one should do > > S4 doesn't always do intuitive things, either. > > Try the following example: > > library (Matrix) > > m = Matrix (1:24, 4, 6) > > > #expected output > > print (m) > > > #not expected output > > print (m, quote=FALSE) > So the correct way to print S4 objects is with show(), not print. A cursory, non-comprehensive look at print.c (do_defaultprint) suggests to me that print (or rather the c code called by print.default) handles S4 objects when the print call can essentially be transformed in-place to a show call and then evaluated. That is the case where no additional arguments are passed to print: if (*noParam*s && IS_S4_OBJECT(x) && isMethodsDispatchOn()) PrintObject(x, &data); else PrintValueRec(x, &data); So it has nothing to do with what argument is used, or the quote argument in particular, at all: >* print(x, quote = TRUE)* <S4 Type Object> attr(,"x") [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 attr(,"Dim") [1] 4 6 attr(,"Dimnames") attr(,"Dimnames")[[1]] NULL attr(,"Dimnames")[[2]] NULL attr(,"factors") list() attr(,"class") [1] "dgeMatrix" attr(,"class")attr(,"package") [1] "Matrix" > *print(x, quote = FALSE)* <S4 Type Object> attr(,"x") [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 attr(,"Dim") [1] 4 6 attr(,"Dimnames") attr(,"Dimnames")[[1]] NULL attr(,"Dimnames")[[2]] NULL attr(,"factors") list() attr(,"class") [1] dgeMatrix attr(,"class")attr(,"package") [1] Matrix > *print(x, digits = 5)* <S4 Type Object> attr(,"x") [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 attr(,"Dim") [1] 4 6 attr(,"Dimnames") attr(,"Dimnames")[[1]] NULL attr(,"Dimnames")[[2]] NULL attr(,"factors") list() attr(,"class") [1] "dgeMatrix" attr(,"class")attr(,"package") [1] "Matrix" But basically, don't call print on S4 objects, call show, and everything should work fine. Best, ~G > However, I still may consider using S4, especially where I would otherwise > use a named list. > > > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel