[Rcpp-devel] Ranges and Casting

Dirk Eddelbuettel edd at debian.org
Sat Jan 16 02:54:12 CET 2021


On 16 January 2021 at 01:35, Francisco Bischoff wrote:
| About the Range() function, I think it should handle decreasing ranges
| too...
| But, idk if using Matlabs approach or R approach:
| 
| R's:
| 
| a <- 1
| b <- 10
| 
| print(a:b)
| 1 2 3 4 5 6 7 8 9 10
| print(b:a)
| 10 9 8 7 6 5 4 3 2 1
| 
| Matlab's
| a = 1;
| b = 10;
| disp(a:b);
| 1 2 3 4 5 6 7 8 9 10
| disp(b:a);
| numeric(0)
| disp(b:-1:a)
| 10 9 8 7 6 5 4 3 2 1
| 
| I think that we are in the R domain, so we should use Range(b, a) normally
| (my humble opinion).

Hm but I think the Range class in Rcpp is not the same as R's seq(). It is
used internally in a few places and may not generalize well to the 'b:-1:a'
use.

I had a quick look, and Armadillo may not have anything directly relevant
either. linspace() is close but not quite the same.

I would probably just write myself a little helper function.

| About Casting, this is a good example:
| 
| Rcout << Range(0, 10) << std::endl;
| 
| This does not compute...
| 
| What should I do?
| 
| Rcout << as<IntegerVector>(Range(0, 10)) << std::endl;
| or
| Rcout << (IntegerVector)(Range(0, 10)) << std::endl;

That can happen as template expressions can get in the way. Alternatives are
maybe using Armadillo types for, again, just using a quick loop and printing
elements.

Rcpp has a lot of functions. But it doesn't have "all of R's functions" and
should not be seen as aiming for that.

Dirk

-- 
https://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org


More information about the Rcpp-devel mailing list