Как удалить NULL элементы списков в Rcpp - PullRequest
0 голосов
/ 19 марта 2019

Как я могу удалить элементы NULL из простого списка, используя Rcpp?
Или как я могу перевести эту R-функцию в Rcpp?

x[!sapply(x, is.null)]

Некоторые данные R для тестирования:

x <- list("a"=1, "b"=NULL, "c"=NULL, "d"=2)
x <- list("b"=NULL, "c"=NULL)

Это то, что я пробовал до сих пор: первый разбивает R & RStudio, а второй возвращает список целых чисел.

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
// Remove the NULL elements iteratively in a for loop (breaks RStudio)
List rm_null(List L) {
  List Lcl = clone(L);
    for (int i = 0; i < Lcl.length(); ++i){
        if (Lcl[i] == R_NilValue) {
            Lcl = Lcl[-i];
        }
    }
  return(Lcl);
}

// [[Rcpp::export]]
// Create a numeric vector with the indices to keep and subset the list afterwards
List rm_null1(List L) {
  List Lcl = clone(L);
  NumericVector ind(Lcl.length());
  for (int i = 0; i < Lcl.length(); ++i){
    if (Lcl[i] != R_NilValue) {
        ind[i] = i;
    }
  }
  return(Lcl[ind]);
}

1 Ответ

3 голосов
/ 19 марта 2019

Вы можете сделать

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List rm_null(List x) {
  int n = x.size();
  LogicalVector to_keep(n);
  for (int i = 0; i < n; i++) {
    to_keep[i] = !Rf_isNull(x[i]);
  }
  return x[to_keep];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...