Значения NA в условном Rcpp

У меня проблемы с условными выражениями в Rcpp. Лучший способ объяснить мою проблему — это пример.

z <- seq(from=1,to=10,by=0.1)
z[c(5,10,15,20,40,50,80)] <- NA
src <- '
 Rcpp::NumericVector vecz(z);
 for (int i=0;i<vecz.size();i++) {
   if (vecz[i] == NA_REAL) {
     std::cout << "Here is  a missing value" << std::endl;
   }
  }
'
func <- cxxfunction(signature(z="numeric"),src,plugin="Rcpp")
func(z)
# NULL

Насколько я понимаю, NA_REAL представляет значения NA для вещественных чисел в Rcpp, а NA_Integer представляет значения NA для целых чисел. Я не уверен, почему приведенное выше условное выражение никогда не возвращает true, учитывая z.


person chandler    schedule 19.07.2012    source источник
comment
Это никогда не верно по той же причине, по которой NA == NA неверно в R.   -  person hadley    schedule 16.11.2012
comment
Что такое NA_REAL тогда? Меня это зацепило прежде всего потому, что x==NA_INTEGER используется в сахарной виньетке Rcpp, поэтому я решил, что NA_REAL будет работать аналогично.   -  person Ian Fellows    schedule 08.05.2014


Ответы (1)


Вы можете использовать функцию уровня R C R_IsNA.

require(Rcpp)
require(inline)
z <- seq(from=1, to=10, by=0.1)
z[c(5, 10, 15, 20, 40, 50, 80)] <- NA

src <- '
 Rcpp::NumericVector vecz(z);
 for (int i=0; i< vecz.size(); i++) {
   if (R_IsNA(vecz[i])) {
     Rcpp::Rcout << "missing value at position " << i + 1  << std::endl;
   }
  }
'

func <- cxxfunction(signature(z="numeric"), src, plugin="Rcpp")

## results
func(z)

missing value at position 5
missing value at position 10
missing value at position 15
missing value at position 20
missing value at position 40
missing value at position 50
missing value at position 80
NULL
person dickoa    schedule 19.07.2012
comment
Сравнение NA с NA дает NA. Так что x[i] == x[i] быстрее, чем R_IsNA(x[i]). - person Artem Klevtsov; 29.03.2016
comment
@ArtemKlevtsov Я не думаю, что вы захотите использовать x[i] == x[i], поскольку все, что по сравнению с «NA», является «NA». Лучшей функцией R будет is.na(x), потому что даже что-то вроде identical(x, NA) не всегда работает (т.е. identical(NA_integer_, NA) возвращает FALSE). - person seasmith; 14.01.2017