[英]How is noNA used in Rcpp?
Hadley Wickham在他的“ Advanced R”书中说:“ noNA(x)
断言向量x
不包含任何缺失值。” 但是我仍然不知道如何使用它。 我做不到
if (noNA(x))
do this
那我应该怎么用呢?
许多Rcpp糖表达式都是通过模板类实现的,这些模板类具有专门用于已知输入对象没有缺失值的情况的模板,从而使基础算法避免了必须执行额外的工作来处理NA
值(例如,调用)到is_na
)。 这仅仅是可能的,因为VectorBase
类具有指示是否底层对象可以 (可,而不是它不一定如此 )有一个布尔参数NA
值,或没有。
noNA
(在VectorBase
对象上调用时)返回Nona
模板类的实例。 请注意, Nona
本身源自
Rcpp::VectorBase<RTYPE, false, Nona<RTYPE,NA,VECTOR>>
// ^^^^^
这意味着返回的对象将使用本质上表示“您可以假定此数据没有NA
值”的信息进行编码。
例如, Rcpp::sum
是通过Rcpp::sugar
命名空间中的Sum
类实现的。 在默认情况下 ,我们看到还有很多工作可以管理丢失值的可能性:
STORAGE get() const {
STORAGE result = 0 ;
R_xlen_t n = object.size() ;
STORAGE current ;
for( R_xlen_t i=0; i<n; i++){
current = object[i] ;
if( Rcpp::traits::is_na<RTYPE>(current) ) // here
return Rcpp::traits::get_na<RTYPE>() ; // here
result += current ;
}
return result ;
}
在另一方面,也有一个专门的情况下,当输入没有缺失值,其中算法做较少的工作:
STORAGE get() const {
STORAGE result = 0 ;
R_xlen_t n = object.size() ;
for( R_xlen_t i=0; i<n; i++){
result += object[i] ;
}
return result ;
}
要回答您的“我如何在实践中应用此问题?”的问题,下面是一个示例:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int Sum(IntegerVector x) {
return sum(x);
}
// [[Rcpp::export]]
int SumNoNA(IntegerVector x) {
return sum(noNA(x));
}
对这两个功能进行基准测试,
set.seed(123)
x <- as.integer(rpois(1e6, 25))
all.equal(Sum(x), SumNoNA(x))
# [1] TRUE
microbenchmark::microbenchmark(
Sum(x),
SumNoNA(x),
times = 500L
)
# Unit: microseconds
# expr min lq mean median uq max neval
# Sum(x) 577.386 664.620 701.2422 677.1640 731.7090 1214.447 500
# SumNoNA(x) 454.990 517.709 556.5783 535.1935 582.7065 1138.426 500
noNA
版本确实更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.