[Rcpp-devel] function created from cxxfunction modifies input?
Joshua Wiley
jwiley.psych at gmail.com
Sun Jul 8 02:05:35 CEST 2012
Hi Alexandre,
Thank you so much! That worked and helped me understand why it was
happening :) The idea of pointers is new to me so I think I need to
spend more time learning about that.
Thanks again,
Josh
On Sat, Jul 7, 2012 at 4:46 PM, Alexandre Bujard
<alexandre.bujard at gmail.com> wrote:
> Hi Joshua,
>
> When you declare "NumericVector xx(x)" xx is a copy of the pointer x. But
> they both address the same location in the memory.
> What you need here is to do a "deep copy" of the vector x. The best was to
> do that in Rcpp is to use the function "clone".
> Also declaring your vector xx with "const" will guarantee that your vector x
> will not be modified by the function.
>
> So your code should look like this :
> ## Rcpp function body
> src <- '
> const NumericVector xx(x);
> int n = xx.size();
> NumericVector res = clone(xx);
>
> int toggle = 0;
> int tot = 100;
> int max = 100;
> [...]
>
> On Sun, Jul 8, 2012 at 1:20 AM, Joshua Wiley <jwiley.psych at gmail.com> wrote:
>>
>> Hi,
>>
>> I am familiar with R but quite new to C++. I am reading a C++
>> textbook, so if this is an obvious question just resulting in my
>> ignorance of C++, please let me know.
>>
>> I tried to translate someone else's R loop that was slow into c++ to
>> use with Rcpp and the inline package:
>>
>> require(Rcpp)
>> require(inline)
>>
>> ## Rcpp function body
>> src <- '
>> NumericVector xx(x);
>> int n = xx.size();
>> NumericVector res(xx);
>> int toggle = 0;
>> int tot = 100;
>> int max = 100;
>>
>> typedef NumericVector::iterator vec_iterator;
>> vec_iterator ixx = xx.begin();
>> vec_iterator ires = res.begin();
>> for (int i = 0; i < n; i++) {
>> if (ixx[i] != 0) {
>> if (toggle == 1) {
>> ires[i] = 0;
>> }
>> if (toggle != 1) {
>> tot += ixx[i];
>> if (tot > max) {
>> max = tot;
>> }
>> if (tot <= max) {
>> if (.98 * max > tot) {
>> toggle = 1;
>> }
>> }
>> }
>> }
>> if (ixx[i] == 0) {
>> tot = 100;
>> max = 100;
>> toggle = 0;
>> }
>> }
>> return res;
>> '
>>
>> ## compile the function
>> foo.rcpp <- cxxfunction(signature(x = "numeric"), src, plugin = "Rcpp")
>>
>> ## here is a little input vector, the function should
>> ## output the same but with a 0 instead of 8
>> > d
>> [1] 0 0 0 1 3 4 5 -1 2 3 -5 8
>> > foo.rcpp(d) # great it works!
>> [1] 0 0 0 1 3 4 5 -1 2 3 -5 0
>> > d # but now d itself has changed?
>> [1] 0 0 0 1 3 4 5 -1 2 3 -5 0
>>
>> It seems particularly surprising to me, because I do not think I even
>> modify the input vector, I copy it into the numeric vector res and
>> alter that.
>>
>> Thanks,
>>
>> Josh
>>
>>
>> --
>> Joshua Wiley
>> Ph.D. Student, Health Psychology
>> Programmer Analyst II, Statistical Consulting Group
>> University of California, Los Angeles
>> https://joshuawiley.com/
>> _______________________________________________
>> 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
>
>
--
Joshua Wiley
Ph.D. Student, Health Psychology
Programmer Analyst II, Statistical Consulting Group
University of California, Los Angeles
https://joshuawiley.com/
More information about the Rcpp-devel
mailing list