[Rd] Attributes of a vector element?

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Tue Feb 22 19:52:18 CET 2022


On 22/02/2022 1:45 p.m., Ivan Krylov wrote:
> On Tue, 22 Feb 2022 13:29:15 -0500
> J C Nash <profjcnash using gmail.com> wrote:
> 
>> pp<-c(1,2)
>> attr(pp[1], "trial")<-"first"
> 
> I don't have a solid proof for this with a link to the R Language
> Definition, but my understanding of the attributes is that they belong
> to the whole vector (and that elements of a vector don't usually exist
> as separate entities in R). Maybe this explains why the attribute of a
> temporary value is lost in this assignment.

That's true for atomic vectors.  lists are also vectors, and they can 
accept attributes on the list as a whole or on the individual elements, 
but it would be done using

    attr(pp[[1]], "trial")<-"first"

(as I just noticed you found below).

I suspect it's an oversight that attr(pp[1], "trial") <- "first" didn't 
trigger an error.  It says to assign the attribute on the subvector 
containing just the first element, but in general such things wouldn't 
be inherited by the full vector.

> 
>> pl<-list(one=1, two=2)
>> attr(pl[1],"trial")<- "lfirst"
> 
> However, this could be made to work, if attributes were assigned on the
> list element instead of the list slice:
> 
> attr(pl[[1]],"trial")<- "lfirst"
> attr(pl[[1]],"trial")
> # [1] "lfirst"
> 
> Same goes for data.frame columns:
> 
> str(data.frame(x = 1:10, y = structure(1:10, attr = 'val')))
> # 'data.frame':   10 obs. of  2 variables:
> #  $ x: int  1 2 3 4 5 6 7 8 9 10
> #  $ y: atomic  1 2 3 4 5 6 7 8 9 10
> #   ..- attr(*, "attr")= chr "val"   # <-- attribute preserved
> 
> If you need to tag rows of a data frame, your best bet would likely be
> to assign a vector as an attribute of the data frame itself.
> 

Yes, you could do

   attr(pp, "trials")[1] <- "someval"

if you already had a "trials" attribute on pp.

Duncan Murdoch



More information about the R-devel mailing list