检查数值向量是否包含na或字符

时间:2018-06-21 06:45:10

标签: r rcpp

我有输入向量,例如:

x1 <- c('NA', 'NA', 'NA')
x2 <- c(NA, NA, NA)

如果这些向量包含NA值或字符值,我想测试(不循环)。

我正在尝试:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {

    if (all(is_na(x)) || (x == NA_STRING))
    {
        Rcout << "NA";
    }

  return x * 2;
}


/*** R
x1 <- c('NA','NA','NA')
x2 <- c(NA,NA,NA)
timesTwo(x1)
timesTwo(x2)
*/

但是它把我扔了

passing 'const LHS_TYPE {aka const Rcpp::sugar::SingleLogicalResult....discards qualifiers

我知道该错误来自以下事实:我必须使用x作为字符串向量并访问每个元素x(1) == NA_STRING

因此,我想将x作为数字矢量,但要检查它是否是字符矢量,例如在R中:

all(is.character(x)

1 个答案:

答案 0 :(得分:5)

这应该使您入门:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
CharacterVector testNA(const SEXP x) {
  CharacterVector test(1, "other"); 
  if (Rf_isString(x)) test = "character";
  if (Rf_isNumeric(x)) {
    NumericVector y = x;
    if (all(is_na(y))) test = "numeric NAs";
  }

  return test;
}

/*** R
x1 <- c('NA','NA','NA')
  x2 <- c(NA,NA,NA)
  x3 <- list(NA)
  testNA(x1)
  testNA(x2)
  testNA(x3)
  */

输出:

> x1 <- c('NA','NA','NA')

>   x2 <- c(NA,NA,NA)

>   x3 <- list(NA)

>   testNA(x1)
[1] "character"

>   testNA(x2)
[1] "numeric NAs"

>   testNA(x3)
[1] "other"

请注意,x2实际上不是数字矢量。这些NA是逻辑值。如果要专门测试Rf_isLogical(或Rf_isIntegerRf_isReal来标识数字),则应该使用{}。