Note
These functions ignore NA
values for now. Adjustments
for handling NA
values are covered in a separate
vignette.
R already provides efficient versions of the functions covered here. This is just to illustrate how to use C++ code.
The explanations and equations used for the functions are taken from Diez et al. (2015) and Hansen (2022). Some examples were adapted from Vaughan, Hester, and Francois (2024).
Sum
For a vector of elements , the sum is calculated as:
The following C++ function calculates the sum of a vector’s elements:
[[cpp4r::register]]
double sum_cpp(doubles x) {
int n = x.size();
double total = 0;
for(int i = 0; i < n; ++i) {
total += x[i];
}
return total;
}
Its R equivalent is:
sum_r <- function(x) {
total <- 0
for (i in seq_along(x)) {
total <- total + x[i]
}
total
}
Document the functions and update the package as in the previous vignettes.
To test the functions, you can run the following benchmark code in the R console:
Arithmetic mean
The arithmetic mean of a vector of elements is calculated as:
The following C++ function calculates the mean of a vector’s elements:
[[cpp4r::register]]
double mean_cpp(doubles x) {
int n = x.size();
double y = 0;
for(int i = 0; i < n; ++i) {
y += x[i];
}
return y / n;
}
Its R equivalent would be:
mean_r <- function(x) {
sum_r(x) / length(x)
}
Document the functions and update the package as in the previous vignettes.
To test the functions, you can run the following benchmark code in the R console:
Variance
The variance of a vector of elements is calculated as:
The following C++ function calculates the variance of a vector’s elements:
[[cpp4r::register]]
double var_cpp(doubles x) {
int n = x.size();
double y1 = 0, y2 = 0;
for(int i = 0; i < n; ++i) {
y1 += x[i];
y2 += pow(x[i], 2.0);
}
return (y2 - pow(y1, 2.0) / n) / (n - 1);
}
Its R equivalent would be:
var_r <- function(x) {
mean_r((x - mean_r(x))^2)
}
Document the functions and update the package as in the previous vignettes.
To test the functions, you can run the following benchmark code in the R console:
Root Mean Square Error (RMSE)
The RMSE function measures the differences between observed values and the true value.
For a vector of elements and a value , the RMSE is calculated as:
The following C++ function calculates the difference of a vector’s elements to a value and returns the square root of the mean of the squared differences:
[[cpp4r::register]]
double rmse_cpp(doubles x, double x0) {
int n = x.size();
double y = 0;
for (int i = 0; i < n; ++i) {
y += pow(x[i] - x0, 2.0);
}
return sqrt(y / n);
}
Its R equivalent would be:
#' Return the root mean square error (R)
#' @param x numeric vector
#' @param x0 numeric value
#' @export
rmse_r <- function(x, x0) {
sqrt(sum((x - x0)^2) / length(x))
}
Document the functions and update the package as in the previous vignettes.
To test the functions, you can run the following benchmark code in the R console: