[Rcpp-devel] strange bool conversion?

Romain Francois romain at r-enthusiasts.com
Mon Jan 10 15:27:10 CET 2011


Le 10/01/11 13:26, Dirk Eddelbuettel a écrit :
>
> On 10 January 2011 at 12:06, Daniel Sabanés Bové wrote:
> | Hi,
> |
> | I have to report another serious bug in argument extraction, now with
> | integers.
> | (It seems to me that the fix by Romain could have been causing this
> | behaviour?)
> | Moreover, the problem does not depend on a "const" modifier:
> |
> | -- snip --
> |
> | library(Rcpp)
> | library(inline)
> |
> | ## this compiles and loads fine, but is wrong:
> | wrong<- cxxfunction(signature(x="list") , '
> |          List input(x);
> |          int a = input[0];
> |          return wrap(a);
> |          ' , plugin = "Rcpp")
> |
> | ## still OK:
> | wrong(list(1))
> |
> | ## all 1:
> | wrong(list(4))
> | wrong(list(4L))
> | wrong(list(-4L))
> |
> |
> | ## this is correct:
> | correct<- cxxfunction(signature(x="list") , '
> |          List input(x);
> |          int a = as<int>(input[0]);
> |          return wrap(a);
> |          ' , plugin = "Rcpp")
> |
> | correct(list(1))
> | wrong(list(4))
> | wrong(list(4L))
> | wrong(list(-4L))
> |
> | -- snap --
>
> So where is the bug?

This is a bug and I'll fix it. Things are supposed to work here without 
the explicit conversion and this has been advertised as such.

Romain

> R>  correct(list(a=42))
> [1] 42
> R>  correct(list(a=42L))
> [1] 42
> R>  correct(list(a=-42L))
> [1] -42
> R>
>
> There is nothing wrong with helping the compiler via explicit template use as
> in
>
> 	int a = as<int>(input[0]);
>
> Dirk
>
>
> | The sessionInfo():
> |
> |
> | R version 2.12.1 (2010-12-16)
> | Platform: i686-pc-linux-gnu (32-bit)
> |
> | locale:
> |  [1] LC_CTYPE=de_CH.utf8       LC_NUMERIC=C
> |  [3] LC_TIME=de_CH.utf8        LC_COLLATE=de_CH.utf8
> |  [5] LC_MONETARY=C             LC_MESSAGES=de_CH.utf8
> |  [7] LC_PAPER=de_CH.utf8       LC_NAME=C
> |  [9] LC_ADDRESS=C              LC_TELEPHONE=C
> | [11] LC_MEASUREMENT=de_CH.utf8 LC_IDENTIFICATION=C
> |
> | attached base packages:
> | [1] stats     graphics  grDevices utils     datasets  methods   base
> |
> | other attached packages:
> | [1] inline_0.3.8 Rcpp_0.9.0
> |
> | loaded via a namespace (and not attached):
> | [1] tools_2.12.1
> |
> |
> | Kind regards,
> | Daniel
> |
> |>  This is fixed now (rev 2789). For the curious, it seems that the
> |>  generic_proxy template made the wrong choice between these conversion
> |>  operators: operator SEXP() const { return get() ; } template<typename
> |>  U>  operator U() const { return ::Rcpp::as<U>(get()) ; } I resolved
> |>  this by forcing the conversion to bool with this: operator bool()
> |>  const { return ::Rcpp::as<bool>(get()) ; } Thanks again for the
> |>  report. Romain Le 13/12/10 17:30, Daniel Saban?s Bov? a ?crit :
> |>>  >  Hi,
> |>>  >
> |>>  >  I have just discovered an extremely strange behaviour in conversion of
> |>>  >  an R logical to a C++ bool. Consider the minimal example:
> |>>  >
> |>>  >  --- snip ---
> |>>  >
> |>>  >  library(Rcpp)
> |>>  >  library(inline)
> |>>  >
> |>>  >  ## this compiles and loads fine, but is wrong:
> |>>  >  wrong<- cxxfunction(signature(x="list") , '
> |>>  >           List input(x);
> |>>  >           const bool a = input[0];
> |>>  >           return wrap(a);
> |>>  >           ' , plugin = "Rcpp")
> |>>  >
> |>>  >  wrong(list(TRUE))
> |>>  >  wrong(list(FALSE))
> |>>  >
> |>>  >  ## this is correct:
> |>>  >  correct<- cxxfunction(signature(x="list") , '
> |>>  >           List input(x);
> |>>  >           const bool a = as<bool>(input[0]);
> |>>  >           return wrap(a);
> |>>  >           ' , plugin = "Rcpp")
> |>>  >
> |>>  >  correct(list(TRUE))
> |>>  >  correct(list(FALSE))
> |>>  >
> |>>  >  --- snap ----
> |>>  >
> |>>  >  In Rcpp 0.8.9 wrong(list(FALSE)) == TRUE, which is quite surprising to
> |>>  >  the user...
> |>>  >  Sorry if this already a known feature, but then I would be curious if
> |>>  >  this behaviour is really wished?
> |>>  >
> |>>  >  Thanks in advance,
> |>>  >  best regards
> |>>  >
> |>>  >  Daniel
> |>  -- Romain Francois Professional R Enthusiast +33(0) 6 28 91 30 30
> |>  http://romainfrancois.blog.free.fr |- http://bit.ly/fT2rZM : highlight
> |>  0.2-5 |- http://bit.ly/gpCSpH : Evolution of Rcpp code size `-
> |>  http://bit.ly/hovakS : RcppGSL initial release
> |
> | _______________________________________________
> | 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
>


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/fT2rZM : highlight 0.2-5
|- http://bit.ly/gpCSpH : Evolution of Rcpp code size
`- http://bit.ly/hovakS : RcppGSL initial release




More information about the Rcpp-devel mailing list