On 22/02/2022 1:45 p.m., Ivan Krylov wrote:> On Tue, 22 Feb 2022 13:29:15 -0500
> J C Nash <profjcnash at 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