22//
33// mean.h: Rcpp R/C++ interface class library -- mean
44//
5- // Copyright (C) 2011 Dirk Eddelbuettel and Romain Francois
5+ // Copyright (C) 2011 - 2014 Dirk Eddelbuettel and Romain Francois
66//
77// This file is part of Rcpp.
88//
@@ -28,23 +28,36 @@ namespace sugar{
2828template <int RTYPE, bool NA, typename T>
2929class Mean : public Lazy < typename Rcpp::traits::storage_type<RTYPE>::type , Mean<RTYPE,NA,T> > {
3030public:
31- typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ;
32- typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
31+ typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ;
32+ typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
3333
34- Mean ( const VEC_TYPE& object_ ) : object(object_){}
34+ Mean ( const VEC_TYPE& object_ ) : object(object_){}
3535
36- STORAGE get () const {
37- return sum (object).get () / object.size () ;
38- }
36+ STORAGE get () const {
37+ // return sum(object).get() / object.size() ;
38+ NumericVector input = object;
39+
40+ int n = input.size (); // double pass (as in summary.c)
41+ long double s = std::accumulate (input.begin (), input.end (), 0 .0L );
42+ s /= n;
43+ if (R_FINITE ((double )s)) {
44+ long double t = 0.0 ;
45+ for (int i = 0 ; i < n; i++) {
46+ t += input[i] - s;
47+ }
48+ s += t/n;
49+ }
50+ return (double )s ;
51+ }
3952private:
40- const VEC_TYPE& object ;
53+ const VEC_TYPE& object ;
4154} ;
4255
4356} // sugar
4457
4558template <bool NA, typename T>
4659inline sugar::Mean<REALSXP,NA,T> mean ( const VectorBase<REALSXP,NA,T>& t){
47- return sugar::Mean<REALSXP,NA,T>( t ) ;
60+ return sugar::Mean<REALSXP,NA,T>( t ) ;
4861}
4962
5063
0 commit comments