[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