你可以通过一个简单的 Rcpp 实现来获得小的性能提升:
library(Rcpp)
library(microbenchmark)
withinR <- function(x,y) x >= y[1] & x <= y[2]
cppFunction("LogicalVector withinCpp(const NumericVector& x, const NumericVector& y) {
double min = y[0], max = y[1];
int n = x.size();
LogicalVector out(n);
for(int i = 0; i < n; ++i) {
double val = x[i];
if (NumericVector::is_na(val)) {
out[i] = NA_LOGICAL;
} else {
out[i] = val >= min & val <= max;
}
}
return out;
}")
x <- sample(100, 1e5, rep = T)
stopifnot(all.equal(withinR(x, c(25, 50)), withinCpp(x, c(25, 50))))
microbenchmark(
withinR(x, c(25, 50)),
withinCpp(x, c(25, 50))
)
在我的计算机上,C++ 版本的速度大约快 4 倍。如果您想使用更多 Rcpp 技巧,您可能还可以进一步调整它,但这似乎已经相当快了。即使是 R 版本也需要非常频繁地调用才能成为瓶颈。
# Unit: microseconds
# expr min lq median uq max
# 1 withinCpp(x, c(25, 50)) 635 659 678 1012 27385
# 2 withinR(x, c(25, 50)) 1969 2031 2573 2954 4082