繁体   English   中英

在Rcpp中如何使用noNA?

[英]How is noNA used in Rcpp?

Hadley Wickham在他的“ Advanced R”书中说:“ noNA(x)断言向量x不包含任何缺失值。” 但是我仍然不知道如何使用它。 我做不到

if (noNA(x))
    do this

那我应该怎么用呢?

http://adv-r.had.co.nz/Rcpp.html#rcpp-sugar

许多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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM