don't print object attributes
On Wed, Aug 29, 2012 at 4:23 AM, Liviu Andronic <landronimirc at gmail.com> wrote:
On Tue, Aug 28, 2012 at 9:05 PM, Duncan Murdoch <murdoch.duncan at 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 at 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.