[Rcpp-devel] Negative vector lengths from rep_each()

Dirk Eddelbuettel edd at debian.org
Mon Oct 29 17:23:17 CET 2018


On 29 October 2018 at 09:12, Barth Riley wrote:
| Dear list
| 
| I have written the following function to produce multidimensional arrays using Rcpp:
| 
| NumericVector arrayFromVector(NumericVector input, IntegerVector dim) { 
|   
|   // check for zero-length vectors
|   if(dim.length() == 0 || input.length() == 0) {
|     return NULL;
|   }
|   
|   long p = 1;
|   for(int i = 0; i < dim.length(); i++) {
|     p *= dim[i];
|   }
|   
|   if((input.length() == 1) & (p > 1)) {
|    	 input = Rcpp::rep_each(input, p);
|   } else if (input.length() != p) {
|     return NULL;
|   } 
|   
|   input.attr("dim") = dim;
|   return input;
| }
| 
| 
| This function usually produces the desired result, but in some cases (it seems with relatively large vector lengths) I get the error “negative length vectors are not allowed.” 

That probably means integer overflow. Integers are "just" 32 bit so this may
happen. R itself uses an "extended" type for this, which is really a double
with larger range.

I would recommend you test for that value.
 
|     input = Rcpp::rep_each(input, p);
| 
| I changed p from an int to a long, thinking I was encountering an overflow issue. But this did not resolve the problem. The test vector contains 45,000 values.

It's not the number of values, but their values.

| Any suggestions?

If you need multidimensional arrays and can use C++14 you may find the
xtensor package useful:

  https://cran.r-project.org/web/packages/xtensor/index.html

Dirk
 
| Thanks in advance
| 
| Barth
| 
| 
| Sent from Mail for Windows 10
| 
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

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


More information about the Rcpp-devel mailing list