The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.
NA values for now. Adjustments for handling NA values are covered in a separate vignette.The following function expands the previous any_cpp() function to handle missing values.
[[cpp4r::register]]
bool any2_cpp(logicals x, bool na_rm = false) {
int n = x.size();
bool has_na = false;
for (int i = 0; i < n; ++i) {
if (x[i] == NA_LOGICAL) {
has_na = true;
if (!na_rm) {
continue; // Skip NA values if na_rm is false
}
} else if (x[i]) {
return true;
}
}
// If we found any NA and na_rm is false, return NA
if (has_na && !na_rm) {
return NA_LOGICAL;
}
return false;
}
Benchmark the functions as in the “Logical Functions” and “Rolling Functions” vignettes.
The following function expands the previous which_cpp() function to handle missing values.
[[cpp4r::register]]
integers which2_cpp(logicals x, bool na_rm = false) {
int n = x.size();
writable::integers res;
int j = 0;
for (int i = 0; i < n; ++i) {
if (x[i] == NA_LOGICAL) {
if (!na_rm) {
// Skip NA values if na_rm is false
continue;
}
} else if (x[i]) {
++j;
res.push_back(i + 1);
}
}
if (j == 0) {
return integers(0);
} else {
return res;
}
}
Benchmark the functions as in the “Logical Functions” and “Rolling Functions” vignettes.
The following function expands the previous all_cpp() function to handle missing values.
[[cpp4r::register]]
bool all2_cpp_1(logicals x, bool na_rm = false) {
int n = x.size();
bool has_na = false;
for (int i = 0; i < n; ++i) {
if (x[i] == NA_LOGICAL) {
has_na = true;
if (!na_rm) {
continue; // Skip NA values if na_rm is false
}
} else if (!x[i]) {
return false;
}
}
// If we found any NA and na_rm is false, return NA
if (has_na && !na_rm) {
return NA_LOGICAL;
}
return true;
}
More concise C++ alternatives are:
[[cpp4r::register]]
bool all2_cpp_2(logicals x, bool na_rm = false) {
bool has_na = false;
for (int i = 0; i < x.size(); ++i) {
if (x[i] == NA_LOGICAL) {
has_na = true;
if (!na_rm) {
continue;
}
} else if (!x[i]) {
return false;
}
}
if (has_na && !na_rm) {
return NA_LOGICAL;
}
return true;
}
[[cpp4r::register]]
bool all2_cpp_3(logicals x, bool na_rm = false) {
bool has_na = false;
for (int i = 0; i < x.size(); ++i) {
if (x[i] == NA_LOGICAL) {
has_na = true;
if (!na_rm) {
continue;
}
} else if (!x[i]) {
return false;
}
}
if (has_na && !na_rm) {
return NA_LOGICAL;
}
return true;
}
Benchmark the functions as in the “Logical Functions” and “Rolling Functions” vignettes.
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.