On Wed, Aug 29, 2012 at 4:23 AM, Liviu Andronic <landronim...@gmail.com> wrote: > On Tue, Aug 28, 2012 at 9:05 PM, Duncan Murdoch > <murdoch.dun...@gmail.com> wrote: >> On 28/08/2012 2:16 PM, Liviu Andronic wrote: >>> I came up with a modified version of the above: >>> print_noattr <- function(x, keep.some=T, ...){ >>> if(keep.some) xa <- attributes(x)[c('names', 'row.names', 'class')] >>> attributes(x) <- NULL >>> if(keep.some) attributes(x) <- xa >>> print(x) >>> } >>> > [..] >>> However this still feels like a hack, and the function should be >>> modified if the object in question contains some other crucial >>> attributes. >> >> I think it's reasonable to say it feels like a hack, because it is. x should >> have had a class and a print method for that class in the first place, if >> the attributes are not something that users should see. If they are things >> you should see, then suppressing them is a bad idea. >> > I think I like most the approach below. > print2 <- function(x, rm.attr=NULL, ...){ > if(!is.null(rm.attr)) attributes(x)[rm.attr] <- NULL > print(x, ...) > } > >> x <- dlply(iris, .(Species), function(x) describe(x[, 'Sepal.Length'])) >> attributes(x) > $split_type > [1] "data.frame" > > $split_labels > Species > 1 setosa > 2 versicolor > 3 virginica > > $names > [1] "setosa" "versicolor" "virginica" > >> print2(x, c("split_type", "split_labels")) > $setosa > x[, "Sepal.Length"] > n missing unique Mean .05 .10 .25 .50 .75 > 50 0 15 5.006 4.40 4.59 4.80 5.00 5.20 > .90 .95 > 5.41 5.61 > > 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5 5.1 5.2 5.3 5.4 5.5 5.7 5.8 > Frequency 1 3 1 4 2 5 4 8 8 3 1 5 2 2 1 > % 2 6 2 8 4 10 8 16 16 6 2 10 4 4 2 > > $versicolor > x[, "Sepal.Length"] > n missing unique Mean .05 .10 .25 .50 .75 > 50 0 21 5.936 5.045 5.380 5.600 5.900 6.300 > .90 .95 > 6.700 6.755 > > lowest : 4.9 5.0 5.1 5.2 5.4, highest: 6.6 6.7 6.8 6.9 7.0 > > $virginica > x[, "Sepal.Length"] > n missing unique Mean .05 .10 .25 .50 .75 > 50 0 21 6.588 5.745 5.800 6.225 6.500 6.900 > .90 .95 > 7.610 7.700 > > lowest : 4.9 5.6 5.7 5.8 5.9, highest: 7.3 7.4 7.6 7.7 7.9 > > > This way the user has complete control over what attributes are > displayed or not. Wouldn't it be reasonable to have such an argument > in print()? >
I'd say no: firstly, print() is incredibly generic (type methods(print) in a typical session) and gets called at every top level eval so you don't really want to add any overhead / complexity to it. But more than that, and to Duncan's point, this is a hack: attributes are usually used to define classes (not rigorously for S3, but in practice) and allowing the user to turn some of them off is likely to break some of the downstream print methods for little perceptible gain. Attributes are there for good reason, I'm not sure why you think they should be generally ignored. That said, if you define print like that locally, it should mask base::print just as well as changing base::print would. Cheers, Michael > Regards > Liviu > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.