<div dir="ltr">Hi Dirk,<div><br></div><div>Thanks very much! Apologies for posting about something that has been covered elsewhere, I did search, but clearly not well enough. (Indeed, I see, this is almost exactly the same issue: <a href="https://stackoverflow.com/questions/11300048/rcpp-pass-by-reference-vs-by-value">https://stackoverflow.com/questions/11300048/rcpp-pass-by-reference-vs-by-value</a> )</div><div><br></div><div>On (3), apologies for being unclear, of course casting from int to double isn't an issue. I meant to say it could be an issue the other way around, namely, double to int. If you instead pass, for example, c(1.1, 2.2, 3.3, 4.4, 5.5, 6.6) to my example function, it'll silently cast that to an integer vector c(1, 2, 3, 4, 5, 6) (i.e., truncating). That said, this isn't really unexpected behaviour, rather exactly what you'd expect if you did {double x = 1.1; int y = (int) x;} in C. I'll pass on writing my own compiler, at least for now :)</div><div><br></div><div>Finally, just to close the loop on this and to make sure I understand... if I don't want to modify the original vector, I should do this, yes?</div><div><br></div><div><div>cppFunction('IntegerVector test_int_vec(IntegerVector x) {</div><div>  IntegerVector y = clone(x);</div><div>  for ( R_xlen_t i = 0; i < x.size(); i++ )</div><div>    y[i] = y[i] * 2;</div><div>  return y;</div><div>}')</div></div><div><br></div><div>Thanks again!</div><div><br></div><div>Evan</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 20, 2017 at 11:44 AM, Dirk Eddelbuettel <span dir="ltr"><<a href="mailto:edd@debian.org" target="_blank">edd@debian.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Hi Evan,<br>
<br>
You mostly got all of this right; the topic has also been discussed a number<br>
of times before here, on SO and in other places.<br>
<div><div class="h5"><br>
On 20 March 2017 at 11:19, Evan Cortens wrote:<br>
| Hi folks,<br>
|<br>
| First, thanks for an amazing package! This is my first post to the Rcpp<br>
| listserv, so please forgive me if I'm missing something obvious.<br>
|<br>
| I've just noticed what, to me at least, is rather unexpected behaviour, as<br>
| follows:<br>
|<br>
| # Here's the Rcpp function<br>
| library(Rcpp)<br>
|<br>
| cppFunction('IntegerVector test_int_vec(IntegerVector x) {<br>
|   for ( R_xlen_t i = 0; i < x.size(); i++ )<br>
|     x[i] = x[i] * 2;<br>
|   return x;<br>
| }')<br>
|<br>
| # This works as expected<br>
| > a <- c(1, 2, 3, 4, 5)<br>
| > a<br>
| [1] 1 2 3 4 5<br>
| > test_int_vec(a)<br>
| [1]  2  4  6  8 10<br>
| > a<br>
| [1] 1 2 3 4 5<br>
|<br>
| # But this doesn't<br>
| > b <- c(1L, 2L, 3L, 4L, 5L)<br>
| > b<br>
| [1] 1 2 3 4 5<br>
| > test_int_vec(b)<br>
| [1]  2  4  6  8 10<br>
| > b<br>
| [1]  2  4  6  8 10<br>
|<br>
|<br>
| You'll see that in the first example, in which I pass a numeric vector, the<br>
| function acts as I'd expect it, namely, it returns the result of the<br>
| calculation, leaving the original vector unmodified. However, in the second<br>
| example, when I pass it an integer vector, it modifies the vector in place, and<br>
| the original vector is changed.<br>
<br>
</div></div>Proxy objects.<br>
<br>
In case two an integer vector is passed as such and modified. In case one the<br>
integer vector _has to be copied first_ to a double vec, hence no in place mod.<br>
<span class=""><br>
| I can only imagine this has something to do with implicit coercion: when the<br>
| reals are coerced to integers in the first example, the vector must be cloned,<br>
| whereas in the second example, in which no coercion is necessary, it's a<br>
| pointer to the original data. Another thing that leads me to believe this is<br>
| that the same thing happens in reverse if you change the return/variable type<br>
| of the function to NumericVector--reals end up being modified in place and<br>
| integers aren't.<br>
|<br>
| In my mind, one of the following things should happen:<br>
| 1) In both situations, the vector is modified in place.<br>
<br>
</span>It does _when the object passed is of the same type as the object in the<br>
signature_.  It it will happen to a numeric vector when you use Rcpp::NumericVector.<br>
<span class=""><br>
| 2) In both situations, the vector is copied--probably this isn't right, as it<br>
| makes it impossible to modify in place.<br>
<br>
</span>Also performance loss that will get worse as the date gets larger.<br>
<span class=""><br>
| 3) Allow modification in place, but throw an error if the wrong type is passed.<br>
<br>
</span>You may have to write a new compiler ... as casting from int to double is<br>
pretty standard.<br>
<br>
Dirk<br>
<span class="">|<br>
| Is this a bug? Am I just misunderstanding? Any help would be appreciated!<br>
|<br>
| Thanks in advance and all best,<br>
|<br>
| Evan<br>
|<br>
| =====<br>
|<br>
| > sessionInfo()<br>
| R version 3.3.2 (2016-10-31)<br>
| Platform: x86_64-w64-mingw32/x64 (64-bit)<br>
| Running under: Windows 7 x64 (build 7601) Service Pack 1<br>
|<br>
| locale:<br>
| [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252<br>
|    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                        <br>
|  <br>
| [5] LC_TIME=English_United States.1252    <br>
|<br>
| attached base packages:<br>
| [1] stats     graphics  grDevices utils     datasets  methods   base     <br>
|<br>
| other attached packages:<br>
| [1] Rcpp_0.12.10<br>
|<br>
| loaded via a namespace (and not attached):<br>
| [1] tools_3.3.2     withr_1.0.2     memoise_1.0.0   digest_0.6.12  <br>
| devtools_1.12.0<br>
|<br>
|<br>
| --<br>
| Evan Cortens, PhD<br>
| Institutional Analyst - Office of Institutional Analysis<br>
| Mount Royal University<br>
| 403-440-6529<br>
</span>| ______________________________<wbr>_________________<br>
| Rcpp-devel mailing list<br>
| <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-<wbr>project.org</a><br>
| <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" rel="noreferrer" target="_blank">https://lists.r-forge.r-<wbr>project.org/cgi-bin/mailman/<wbr>listinfo/rcpp-devel</a><br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
<a href="http://dirk.eddelbuettel.com" rel="noreferrer" target="_blank">http://dirk.eddelbuettel.com</a> | @eddelbuettel | <a href="mailto:edd@debian.org">edd@debian.org</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><span style="color:rgb(0,0,0);font-family:sans-serif;font-size:small">Evan Cortens, PhD</span><br style="color:rgb(0,0,0);font-family:sans-serif;font-size:12.8px"><span style="color:rgb(0,0,0);font-family:sans-serif;font-size:x-small">Institutional Analyst - Office of Institutional Analysis</span><br style="color:rgb(0,0,0);font-family:sans-serif;font-size:12.8px"><span style="color:rgb(0,0,0);font-family:sans-serif;font-size:x-small">Mount Royal University</span><br style="color:rgb(0,0,0);font-family:sans-serif;font-size:12.8px"><span style="color:rgb(0,0,0);font-family:sans-serif;font-size:x-small">403-440-6529</span><br></div></div></div></div></div></div></div></div>
</div>