[Rcpp-devel] strange bool conversion?
Daniel Sabanés Bové
daniel.sabanesbove at ifspm.uzh.ch
Mon Jan 10 12:06:01 CET 2011
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 --
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
More information about the Rcpp-devel
mailing list