2
2
//
3
3
// mean.h: Rcpp R/C++ interface class library -- mean
4
4
//
5
- // Copyright (C) 2011 Dirk Eddelbuettel and Romain Francois
5
+ // Copyright (C) 2011 - 2014 Dirk Eddelbuettel and Romain Francois
6
6
//
7
7
// This file is part of Rcpp.
8
8
//
@@ -28,23 +28,36 @@ namespace sugar{
28
28
template <int RTYPE, bool NA, typename T>
29
29
class Mean : public Lazy < typename Rcpp::traits::storage_type<RTYPE>::type , Mean<RTYPE,NA,T> > {
30
30
public:
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 ;
33
33
34
- Mean ( const VEC_TYPE& object_ ) : object(object_){}
34
+ Mean ( const VEC_TYPE& object_ ) : object(object_){}
35
35
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
+ }
39
52
private:
40
- const VEC_TYPE& object ;
53
+ const VEC_TYPE& object ;
41
54
} ;
42
55
43
56
} // sugar
44
57
45
58
template <bool NA, typename T>
46
59
inline 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 ) ;
48
61
}
49
62
50
63
0 commit comments