Обнаружение и пропуск значений na из стандартного вектора в Rcpp - PullRequest
0 голосов
/ 10 января 2019

У меня есть std :: vector; чьи элементы необходимо суммировать после проверки, есть ли в ней какие-либо значения Na (и, очевидно, удаляя значения Na, если они есть). Я должен сделать это в Rcpp. Теперь для числового вектора в Rcpp (NumericVector); это очень просто, как показано в коде ниже:

    cppFunction("
       double res ( NumericVector x){
         NumericVector v = x[! is_na(x)];
         return sum(v);
        }
        ")

. Таким образом, для вектора «х» это легко дает сумму следующим образом:

       x<- c(NaN,1,2)
       res(x)
       [1] 3

Теперь для std :: vector x; как я могу сделать то же самое?

1 Ответ

0 голосов
/ 10 января 2019

Вы должны иметь возможность использовать RcppHoney (также на CRAN здесь ), который переносит векторизованные идиомы Rcpp Sugar (который векторизовал NA-тесты точно так же, как R) в любой итерируемый контейнер - следовательно, также STL.

См., Например, в виньетка для этого примера объединения различных векторных типов и классов в одно скалярное выражение:

// [[Rcpp::export]]
Rcpp::NumericVector example_manually_hooked() {

    // We manually hooked std::list in to RcppHoney so we'll create one
    std::list< int > l;
    l.push_back(1); l.push_back(2); l.push_back(3); l.push_back(4); l.push_back(5);

    // std::vector is already hooked in to RcppHoney in default_hooks.hpp so
    // we'll create one of those too
    std::vector< int > v(l.begin(), l.end());

    // And for good measure, let's create an Rcpp::NumericVector which is
    // also hooked by default
    Rcpp::NumericVector v2(v.begin(), v.end());

    // Now do some weird operations incorporating std::vector, std::list,
    // Rcpp::NumericVector and some RcppHoney functions and return it.  The
    // return value will be equal to the following R snippet:
    //     v <- 1:5
    //     result <- 42 + v + v + log(v) - v - v + sqrt(v) + -v + 42

    // We can store our result in any of RcppHoney::LogicalVector,
    // RcppHoney::IntegerVector, or RcppHoney::NumericVector and simply return
    // it to R.  These classes inherit from their Rcpp counterparts and add a
    // new constructor.  The only copy of the data, in this case, is when we
    // assign our expression to retval.  Since it is then a "native" R type,
    // returning it is a shallow copy.  Alternatively we could write this as:
    //     return Rcpp::wrap(1 + v + RcppHoney::log(v) - v - 1
    //         + RcppHoney::sqrt(v) + -v2);

    RcppHoney::NumericVector retval
        =  42 + l + v + RcppHoney::log(v) - v - l + RcppHoney::sqrt(v) + -v2
            + 42;
    return retval;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...