[Rd] M[cbind()] <- assignment with Matrix object loses attributes

Ben Bolker bbo|ker @end|ng |rom gm@||@com
Sat Aug 22 22:41:00 CEST 2020


   Thanks for taking a look!

    Hmm, really?  In `R Under development (unstable) (2020-08-14 
r79020)`, doing the indexed assignment with a regular matrix (as opposed 
to a Matrix) appears to preserve attributes.

m1 <- matrix(1:9,3,3)
attr(m1,"junk") <- 12
stopifnot(isTRUE(attr(m1,"junk")==12)) ## OK
m1[cbind(1:2,2:3)] <- 1
stopifnot(isTRUE(attr(m1,"junk")==12)) ## OK
attr(m1,"junk")  ## 12

    Do you lose attributes with this code? It would surprise me if this 
had changed in recent versions but I guess anything's possible ...

On 8/22/20 3:36 AM, Abby Spurdle wrote:
> Hi Ben,
> 
> I had some problems reproducing this.
> As far as I can tell *all* indexed assignments drop attributes.
> (Maybe we have different versions).
> 
> I'm not an expert on S4, but I'm unenthusiastic about mixing slot (S4)
> semantics with attribute (S3) semantics.
> And str() excludes attributes, but attributes() includes slots.
> Highlighting the problems here...
> 
> I think R should generate an error or a warning, if a user tries to
> assign attributes to S4 objects.
> 
> In saying that, mixing OO design with numerical linear algebra is a gold mine...
> 
> 
> On Tue, Aug 11, 2020 at 1:23 PM Ben Bolker <bbolker using gmail.com> wrote:
>>
>>     Does this constitute a bug, or is there something I'm missing?
>> assigning sub-elements of a sparse Matrix via M[X]<-..., where X is a
>> 2-column matrix, appears to drop user-assigned attributes. I dug around
>> in the R code for Matrix trying to find the relevant machinery but my
>> brain started to hurt too badly ...
>>
>>      Will submit this as a bug if it seems warranted.
>>
>> library(Matrix)
>> m1 <- matrix(1:9,3,3)
>> m1 <- Matrix(m1)
>> attr(m1,"junk") <- 12
>> stopifnot(isTRUE(attr(m1,"junk")==12))  ## OK
>> m1[cbind(1:2,2:3)] <- 1
>> stopifnot(isTRUE(attr(m1,"junk")==12)) ## not OK
>> attr(m1,"junk") ## NULL
>>
>>
>> ## note I have to use the ugly stopifnot(isTRUE(...)) because a missing
>> attribute returns NULL, an assignment to NULL returns NULL, and
>> stopifnot(NULL) doesn't stop ...
>>
>>
>>      cheers
>>
>>        Ben Bolker
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list