<div dir="ltr">Wonderful! Thanks again!<div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 20, 2017 at 12:13 PM, 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>
Evan,<br>
<span class=""><br>
On 20 March 2017 at 12:02, Evan Cortens wrote:<br>
| Thanks very much! Apologies for posting about something that has been covered<br>
| elsewhere, I did search, but clearly not well enough. (Indeed, I see, this is<br>
| almost exactly the same issue: <a href="https://stackoverflow.com/questions/11300048/" rel="noreferrer" target="_blank">https://stackoverflow.<wbr>com/questions/11300048/</a><br>
| rcpp-pass-by-reference-vs-by-<wbr>value )<br>
<br>
</span>No worries. I think this should be in the R FAQ. I need to add something...<br>
<span class=""><br>
| On (3), apologies for being unclear, of course casting from int to double isn't<br>
| an issue. I meant to say it could be an issue the other way around, namely,<br>
| double to int. If you instead pass, for example, c(1.1, 2.2, 3.3, 4.4, 5.5,<br>
| 6.6) to my example function, it'll silently cast that to an integer vector c(1,<br>
| 2, 3, 4, 5, 6) (i.e., truncating). That said, this isn't really unexpected<br>
| behaviour, rather exactly what you'd expect if you did {double x = 1.1; int y =<br>
| (int) x;} in C. I'll pass on writing my own compiler, at least for now :)<br>
<br>
</span>I know. I was just being snarky -- some of these things we cannot test for as<br>
the compiler gets in the way. As in should, because most of the time it does<br>
know better.<br>
<span class=""><br>
| Finally, just to close the loop on this and to make sure I understand... if I<br>
| don't want to modify the original vector, I should do this, yes?<br>
|<br>
| cppFunction('IntegerVector test_int_vec(IntegerVector x) {<br>
|   IntegerVector y = clone(x);<br>
|   for ( R_xlen_t i = 0; i < x.size(); i++ )<br>
|     y[i] = y[i] * 2;<br>
|   return y;<br>
| }')<br>
<br>
</span>Yes, pretty much.   And the simpler code here works too:<br>
<br>
R> cppFunction("IntegerVector test_int_vec(IntegerVector x) { return 2*x; }")<br>
R> vec <- c(1L, 2L, 3L)<br>
R> test_int_vec(vec)<br>
[1] 2 4 6<br>
R> vec<br>
[1] 1 2 3<br>
R><br>
<span class="HOEnZb"><font color="#888888"><br>
Dirk<br>
</font></span><div class="HOEnZb"><div class="h5"><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>
</div></div></blockquote></div><div><br></div>
</div></div>