[R] don't print object attributes

R. Michael Weylandt michael.weylandt at gmail.com
Wed Aug 29 16:29:27 CEST 2012


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.




More information about the R-help mailing list