When something gets printed by the "print.default" function, any extra attributes are printed without regard to their class attribute (if any). For example:> x <- 1:3 > attr( x, 'other') <- factor( c( 'cat', 'dog')) > attr( x, 'other')[1] cat dog Levels: cat dog> x[1] 1 2 3 attr(,"other") [1] 1 2 which is perhaps surprising. Would it be preferable for "print.default" to call the generic "print" for each attribute, so that any class-specific print methods are respected? BTW, the same applies to "print.matrix" (which doesn't rely on "print"), and perhaps to other print methods. Of course, it will also apply to any class-specific print method which invokes "print" or "NextMethod", too. [ Lest this seem incredibly arcane, here's some context: I'm experimenting (as others have done) with storing documentation in a "doc" attribute. I'd like to be able to give the "doc" attribute a class so I can control how it's displayed by a default print, without having to derive a new class & print method for the object-being-documented. ] cheers Mark ******************************* Mark Bravington CSIRO (CMIS) PO Box 1538 Castray Esplanade Hobart TAS 7001 phone (61) 3 6232 5118 fax (61) 3 6232 5012 Mark.Bravington@csiro.au
On Thu, 30 Jan 2003 Mark.Bravington@csiro.au wrote:> When something gets printed by the "print.default" function, any extra > attributes are printed without regard to their class attribute (if any). For > example: > > > x <- 1:3 > > attr( x, 'other') <- factor( c( 'cat', 'dog')) > > attr( x, 'other') > [1] cat dog > Levels: cat dog > > x > [1] 1 2 3 > attr(,"other") > [1] 1 2 > > which is perhaps surprising. Would it be preferable for "print.default" to > call the generic "print" for each attribute, so that any class-specific > print methods are respected?That does seem unintentional, and not what S does.> BTW, the same applies to "print.matrix" (which doesn't rely on "print"), and > perhaps to other print methods. Of course, it will also apply to any > class-specific print method which invokes "print" or "NextMethod", too.In R-devel print.matrix *does* rely on print, and *is* a print method. But the old-style prmatrix aka print.matrix does not print attributes normally:> x <- matrix(1:4, 2, 2) > attr( x, 'other') <- factor( c( 'cat', 'dog')) > prmatrix(x)[,1] [,2] [1,] 1 3 [2,] 2 4 So how did you make it print attributes? -- Brian D. Ripley, ripley@stats.ox.ac.uk 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
#-----Original Message----- #From: ripley@stats.ox.ac.uk [mailto:ripley@stats.ox.ac.uk] #Sent: Thursday, 30 January 2003 6:42 PM #To: Mark.Bravington@csiro.au #Cc: r-devel@stat.math.ethz.ch #Subject: Re: [Rd] print.default and attributes # # #On Thu, 30 Jan 2003 Mark.Bravington@csiro.au wrote: # #> When something gets printed by the "print.default" function, #any extra #> attributes are printed without regard to their class #attribute (if any). << snipped >> # #> BTW, the same applies to "print.matrix" (which doesn't rely #on "print"), and #> perhaps to other print methods. Of course, it will also apply to any #> class-specific print method which invokes "print" or #"NextMethod", too. # #In R-devel print.matrix *does* rely on print, and *is* a print method. #But the old-style prmatrix aka print.matrix does not print attributes #normally: # #> x <- matrix(1:4, 2, 2) #> attr( x, 'other') <- factor( c( 'cat', 'dog')) #> prmatrix(x) # [,1] [,2] #[1,] 1 3 #[2,] 2 4 # #So how did you make it print attributes? Ummm... good point; I guess I didn't, despite thinking I had. All I did was type "x" instead of "prmatrix( x)" in what you've given above; in that case, the attributes are printed (albeit without regard to class). My assumption was that, if "x" was a matrix (i.e. had a "dim" attribute), then "x" would be printed using "print.matrix" rather than "print.default". Evidently, more is going on. The R1.6.2 code for "print.default" and "print.matrix" is mostly .Internal, so I can't tell what's happening. But in S2000, FWIW, what happens is that "print.default" spots the presence of attributes and therefore calls "print.structure", which (i) spots the "dim" and therefore calls "print.matrix" (no attributes displayed) and then (ii) explicitly prints any extra attributes (by calling "print", so that attribute classes are respected). cheers Mark # #-- #Brian D. Ripley, ripley@stats.ox.ac.uk #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 # ******************************* Mark Bravington CSIRO (CMIS) PO Box 1538 Castray Esplanade Hobart TAS 7001 phone (61) 3 6232 5118 fax (61) 3 6232 5012 Mark.Bravington@csiro.au