[Rd] dim<-() changed in R-devel; no longer removing "dimnames" when doing dim(x) <- dim(x)

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Mon Oct 30 11:53:21 CET 2023


>>>>> Henrik Bengtsson 
>>>>>     on Sun, 29 Oct 2023 10:42:19 -0700 writes:

    > Hello,

    > the fix of PR18612
    > (https://bugs.r-project.org/show_bug.cgi?id=18612) in
    > r85380
    > (https://github.com/wch/r-source/commit/2653cc6203fce4c48874111c75bbccac3ac4e803)
    > caused a change in `dim<-()`.  Specifically, in the past,
    > any `dim<-()` assignment would _always_ remove "dimnames"
    > and "names" attributes per help("dim"):


    >     The replacement method changes the "dim" attribute
    > (provided the new value is compatible) and removes any
    > "dimnames" and "names" attributes.

    > In the new version, assigning the same "dim" as before
    > will no longer remove "dimnames".  I'm reporting here to
    > check whether this change was intended, or if it was an
    > unintended side effect of the bug fix.

    > For example, in R Under development (unstable) (2023-10-21
    > r85379), we would get:

    >> x <- array(1:2, dim=c(1,2), dimnames=list("A",
    >> c("a","b"))) str(dimnames(x))
    > List of 2 $ : chr "A" $ : chr [1:2] "a" "b"

    >> dim(x) <- dim(x) ## Removes "dimnames" no matter what
    >> str(dimnames(x))
    >  NULL


    > whereas in R Under development (unstable) (2023-10-21
    > r85380) and beyond, we now get:

    >> x <- array(1:2, dim=c(1,2), dimnames=list("A",
    >> c("a","b"))) str(dimnames(x))
    > List of 2 $ : chr "A" $ : chr [1:2] "a" "b"

    >> dim(x) <- dim(x) ## No longer removes "dimnames"
    >> str(dimnames(x))
    > List of 2 $ : chr "A" $ : chr [1:2] "a" "b"

    >> dim(x) <- rev(dim(x)) ## Still removes "dimnames"
    >> str(dimnames(x))
    >  NULL

    > /Henrik

Thank you, Henrik.

This is "funny" (in an unusal sense):
indeed, the change was *in*advertent, by me (svn rev 85380).

I had experimentally {i.e., only in my own private version of R-devel!}
modified the behavior of `dim<-` somewhat 
such it does *not* unnecessarily drop dimnames,
e.g., in your   `dim(x) <- dim(x)` case above,
one could really argue that it's a "true loss" if x loses
dimnames "unnecessarily" ... 

OTOH, I knew in the mean time that  `dim<-` has always been
documented to drop dimnames in all cases,  and even more
importantly, I got a strong recommendation to *not* go further
with this idea -- not only for back compatibility reasons, but
also for internal logical consistency.

Most probably, we will just revert this inadvertent change,
but before that ... since it has been out in the wild anyway,
we could quickly consider if it *did* break code.

I assume it did, or you would not have noticed ?

Martin



More information about the R-devel mailing list