cpp11 icon indicating copy to clipboard operation
cpp11 copied to clipboard

correctly set dimnames for matrices

Open pachadotdev opened this issue 1 year ago • 5 comments

There was a bug in the matrix class such that attributes cannot be set (ref: https://stackoverflow.com/a/76019987/3720258). This was mentioned in #273.

With cpp11 0.5.1 I can add row and column names from C++ as long as the object is a sexp instead of a *_matrix<> (example: https://github.com/pachadotdev/economiccomplexity/blob/main/src/code.cpp#L28-L29)

With these changes, it is possible to assign colnames/rownames by borrowing from an input matrix or by setting dimnames = list(...).

Acknowledgements to @stephematician! It only took me 2 yrs to take intensive C++ courses at UofT to 1st learn proper C++, and then use that knowledge for my own research.

~There is a problem with gh-actions. On my laptop, I can use auto, attribute_proxy<V> or `SEXP for lines 192-194 in matrix.hpp and it works. With GHA, it return an error.~ I fixed that with a workaround.

pachadotdev avatar Dec 27 '24 09:12 pachadotdev

You can test on similar platforms to github actions with devtools::check_win_release and devtools::check_rhub.

stephematician avatar Dec 27 '24 22:12 stephematician

You can test on similar platforms to github actions with devtools::check_win_release and devtools::check_rhub.

yes! it's fixed now

pachadotdev avatar Dec 28 '24 03:12 pachadotdev

Nicely done!

Not that I'm a cpp11 developer - but as a matter of style, I would make the tests 'simpler' and more clear about what they test. For example, there's no need to calculate logarithms. I would test two things specifically:

  1. That you can assign dimnames given two (suitable) vectors in a list; e.g. a function with signature cpp11::doubles_matrix<> matrix_with_dimnames(int n, int m, cpp11::list dimnames) { /* ... */ }
  2. That you can assign dimnames using another matrices' dimnames, e.g. a function like cpp11::doubles_matrix<> duplicate_with_dimnames(cpp11::doubles_matrix<> x) { /* ... */ }

stephematician avatar Dec 28 '24 03:12 stephematician

Nicely done!

Not that I'm a cpp11 developer - but as a matter of style, I would make the tests 'simpler' and more clear about what they test. For example, there's no need to calculate logarithms. I would test two things specifically:

1. That you can assign dimnames given two (suitable) vectors in a list; e.g. a function with signature `cpp11::doubles_matrix<> matrix_with_dimnames(int n, int m, cpp11::list dimnames) { /* ... */ }`

2. That you can assign dimnames using another matrices' dimnames, e.g. a function like `cpp11::doubles_matrix<> duplicate_with_dimnames(cpp11::doubles_matrix<> x) { /* ... */ }`

good point ! the log was just a "my brain defaults to log and OLS"

pachadotdev avatar Dec 28 '24 06:12 pachadotdev

it would be good to merge this PR and then adapt the tests here

pachadotdev avatar Dec 29 '24 16:12 pachadotdev

hi @DavisVaughan and @hadley any change to merge this one? this one is particularly useful

pachadotdev avatar Aug 22 '25 19:08 pachadotdev