我有输入向量,例如:
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)
答案 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_isInteger
和Rf_isReal
来标识数字),则应该使用{1>}。