/usr/lib/R/site-library/dplyr/include/dplyr/Result/Mean.h is in r-cran-dplyr 0.7.4-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #ifndef dplyr_Result_Mean_H
#define dplyr_Result_Mean_H
#include <dplyr/Result/Processor.h>
namespace dplyr {
namespace internal {
// version for NA_RM == true
template <int RTYPE, bool NA_RM, typename Index>
struct Mean_internal {
static double process(typename Rcpp::traits::storage_type<RTYPE>::type* ptr, const Index& indices) {
typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE;
long double res = 0.0;
int n = indices.size();
int m = 0;
for (int i = 0; i < n; i++) {
STORAGE value = ptr[ indices[i] ];
if (! Rcpp::traits::is_na<RTYPE>(value)) {
res += value;
m++;
}
}
if (m == 0) return R_NaN;
res /= m;
if (R_FINITE(res)) {
long double t = 0.0;
for (int i = 0; i < n; i++) {
STORAGE value = ptr[indices[i]];
if (! Rcpp::traits::is_na<RTYPE>(value)) {
t += value - res;
}
}
res += t / m;
}
return (double)res;
}
};
// special cases for NA_RM == false
template <typename Index>
struct Mean_internal<INTSXP, false, Index> {
static double process(int* ptr, const Index& indices) {
long double res = 0.0;
int n = indices.size();
for (int i = 0; i < n; i++) {
int value = ptr[ indices[i] ];
// need to handle missing value specifically
if (value == NA_INTEGER) {
return NA_REAL;
}
res += value;
}
res /= n;
if (R_FINITE((double)res)) {
long double t = 0.0;
for (int i = 0; i < n; i++) {
t += ptr[indices[i]] - res;
}
res += t / n;
}
return (double)res;
}
};
template <typename Index>
struct Mean_internal<REALSXP, false, Index> {
static double process(double* ptr, const Index& indices) {
long double res = 0.0;
int n = indices.size();
for (int i = 0; i < n; i++) {
res += ptr[ indices[i] ];
}
res /= n;
if (R_FINITE((double)res)) {
long double t = 0.0;
for (int i = 0; i < n; i++) {
t += ptr[indices[i]] - res;
}
res += t / n;
}
return (double)res;
}
};
} // namespace internal
template <int RTYPE, bool NA_RM>
class Mean : public Processor< REALSXP, Mean<RTYPE, NA_RM> > {
public:
typedef Processor< REALSXP, Mean<RTYPE, NA_RM> > Base;
typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE;
Mean(SEXP x, bool is_summary_ = false) :
Base(x),
data_ptr(Rcpp::internal::r_vector_start<RTYPE>(x)),
is_summary(is_summary_)
{}
~Mean() {}
inline double process_chunk(const SlicingIndex& indices) {
if (is_summary) return data_ptr[indices.group()];
return internal::Mean_internal<RTYPE, NA_RM, SlicingIndex>::process(data_ptr, indices);
}
private:
STORAGE* data_ptr;
bool is_summary;
};
}
#endif
|