[Rcpp-devel] Rcpp equivalent of sample()?

Dirk Eddelbuettel edd at debian.org
Sun May 15 03:19:16 CEST 2011


On 14 May 2011 at 18:01, Chris DuBois wrote:
| Thanks Dirk.  Passing the addition function in the includes argument worked
| great.  
| 
| Also, one of the links from your suggested Google search led me to this
| (working) example for std::accumulate:
| 
| src <- 'NumericVector xx(x);
| return wrap( std::accumulate( xx.begin(), xx.end(), 0.0));'
| fx <- cxxfunction(signature( x = "numeric" ),body=src,plugin = "Rcpp")
| fx(1:10)  # 55
| 
| I had been copying the quickref and using:  std::accumulate( xx.begin(),
| xx.end(),std::plus<double>(),0.0)
| 
| I think this might be a typo where the last two arguments are transposed (which
| I shouldn't have noticed after browsing the function's c++ reference), as the
| following works just fine:  std::accumulate( xx.begin(), xx.end
| (),0.0,std::plus<double>())

Good catch.  The arguments are

     start, end, intial value, (optional) operator function

and std::plus<double>() is the default for summation. So that was an error,
and hence a Thank You! for catching it.  I just committed this new section:


\paragraph{STL interface}~
  \newline
<<lang=cpp>>=
// sum a vector from beginning to end
double s = std::accumulate(x.begin(),
   x.end(), 0.0);
// prod of elements from beginning to end
int p = std::accumulate(vec.begin(),
    vec.end(), 1, std::multiplies<int>());
// inner_product to compute sum of squares
double s2 = std::inner_product(res.begin(),
    res.end(), res.begin(), 0.0);
@


which shows std::multiplies<int>() as an alternative operator for accumulate
as well as inner_product for a sum-of-squares computation (as once suggested
by Doug).

Dirk

-- 
Gauss once played himself in a zero-sum game and won $50.
                      -- #11 at http://www.gaussfacts.com


More information about the Rcpp-devel mailing list