[R] don't print object attributes

Liviu Andronic landronimirc at gmail.com
Wed Aug 29 11:23:49 CEST 2012


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()?

Regards
Liviu




More information about the R-help mailing list