[Rcpp-devel] Broken conversion from R-type integer to uvec after update to newer Rcpp version
Venelin Mitov
vmitov at gmail.com
Sun Apr 20 15:46:35 CEST 2014
Hi again,
Here is an example:
my c++ file:
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
#include <Rcpp.h>
using namespace Rcpp ;
using namespace arma ;
using namespace std ;
// [[Rcpp::export]]
uvec touvec(const uvec& v) {
return v;
}
Save to "example.cpp" and call the following in R-console:
> Rcpp::sourceCpp('example.cpp')
> touvec(1:10) [,1]
[1,] 0
[2,] 1072693248
[3,] 0
[4,] 1073741824
[5,] 0
[6,] 1074266112
[7,] 0
[8,] 1074790400
[9,] 0
[10,] 1075052544
Best,
Venelin
2014-04-20 15:34 GMT+02:00 Dirk Eddelbuettel <edd at debian.org>:
>
> Hi Venelin,
>
> On 20 April 2014 at 15:18, Venelin Mitov wrote:
> | Hello,
> |
> | I have a dynamic library with C++ functions built using Rcpp. I've
> recently
> | updated to the newest version of R/Rcpp/RcppArmadillo and after
> rebuilding my
> | library it lost its expected behavior. After some debugging I found that
> one of
> | possibly several problems is the following:
> |
> | I have an exported cpp function with the following signature:
> | uvec shift(const uvec& idx, int dshift, int n, int i=1);
> |
> | In my R-code I call this function as follows:
> | shifted_idx <- shift(1:10, 5, 10, 1).
> | This is a detail, but let me mension that all this function does is to
> rotate
> | the vector of indices idx left by 5 positions, so the result should be
> the
> | vector: c(6,7,8,9,10,1,2,3,4,5).
> |
> | This is the wrapper for the same function generated with the older
> | Rcpp-version:
> | RcppExport SEXP sourceCpp_28368_shift(SEXP idxSEXP, SEXP dshiftSEXP, SEXP
> | nSEXP, SEXP iSEXP) {
> | BEGIN_RCPP
> | SEXP __sexp_result;
> | {
> | Rcpp::RNGScope __rngScope;
> | uvec idx = Rcpp::as<uvec >(idxSEXP);
> | int dshift = Rcpp::as<int >(dshiftSEXP);
> | int n = Rcpp::as<int >(nSEXP);
> | int i = Rcpp::as<int >(iSEXP);
> | uvec __result = shift(idx, dshift, n, i);
> | PROTECT(__sexp_result = Rcpp::wrap(__result));
> | }
> | UNPROTECT(1);
> | return __sexp_result;
> | END_RCPP
> | }
> |
> | This is the wrapper for this function generated with the newer
> Rcpp-version:
> | RcppExport SEXP sourceCpp_85322_shift(SEXP idxSEXP, SEXP dshiftSEXP, SEXP
> | nSEXP, SEXP iSEXP) {
> | BEGIN_RCPP
> | SEXP __sexp_result;
> | {
> | Rcpp::RNGScope __rngScope;
> | Rcpp::traits::input_parameter< const uvec& >::type idx(idxSEXP );
> | Rcpp::traits::input_parameter< int >::type dshift(dshiftSEXP );
> | Rcpp::traits::input_parameter< int >::type n(nSEXP );
> | Rcpp::traits::input_parameter< int >::type i(iSEXP );
> | uvec __result = shift(idx, dshift, n, i);
> | PROTECT(__sexp_result = Rcpp::wrap(__result));
> | }
> | UNPROTECT(1);
> | return __sexp_result;
> | END_RCPP
> | }
> |
> | The result is that the converted array idx in the newer version has
> apparently
> | different values than the the passed argument which is simply 1:10. If,
> for
> | debugging purpose, I modify the function to simply return its first
> argument
> | this is the value I'm getting:
> |
> |
> | > shift(1:10,5,10,1)
> | [,1]
> | [1,] 0
> | [2,] 1072693248
> | [3,] 0
> | [4,] 1073741824
> | [5,] 0
> | [6,] 1074266112
> | [7,] 0
> | [8,] 1074790400
> | [9,] 0
> | [10,] 1075052544
> |
> |
> | I'm running this on a 64 bit computer and I could reproduce it on Ubuntu
> as well.
> |
> | I guess that this behaviour is wrong.
> |
> | To check versions, here is the output of sessionInfo():
> |
> | R version 3.0.1 (2013-05-16)
> | Platform: x86_64-w64-mingw32/x64 (64-bit)
> |
> | locale:
> | [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United
> States.1252
> | [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
> | [5] LC_TIME=English_United States.1252
> |
> | attached base packages:
> | [1] stats graphics grDevices utils datasets methods base
> |
> | other attached packages:
> | [1] Rcpp_0.11.1
> |
> | loaded via a namespace (and not attached):
> | [1] RcppArmadillo_0.4.200.0 tools_3.0.1
>
> It is entirely possible that something is wrong, and while you provided an
> appreciable level of detail, you have not provided a small, self-contained,
> reproducible piece of code.
>
> That would help.
>
> Below are two conversions from Armadillo 'uvec' and 'ivec'. They work for
> me.
>
>
> R> cppFunction("SEXP uvec(int n) { arma::uvec v =
> arma::conv_to<arma::uvec>::from(arma::ones(n)); return(wrap(v)); }",
> depends="RcppArmadillo")
> R> uvec(3)
> [,1]
> [1,] 1
> [2,] 1
> [3,] 1
> R> cppFunction("SEXP ivec(int n) { arma::ivec v =
> arma::conv_to<arma::ivec>::from(arma::ones(n)); return(wrap(v)); }",
> depends="RcppArmadillo")
> R> ivec(3)
> [,1]
> [1,] 1
> [2,] 1
> [3,] 1
> R>
>
> In both cases I use ones() to generate (double-valued) vector which I cast
> using Armadillo's converter function. The resulting integer, and unsigned
> integer, vectors are then converted via wrap(). In both cases do the
> correct
> values appear.
>
> I probably missed a key aspect of your bug report. Can you provide a
> simple example?
>
> Thanks!
>
> Dirk
>
>
> |
> |
> | Best,
> |
> | Venelin
> |
> |
> | ----------------------------------------------------------------------
> | _______________________________________________
> | 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
> --
> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
>
--
Venelin MITOV
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20140420/4433ac24/attachment-0001.html>
More information about the Rcpp-devel
mailing list