如何在Rcpp中删除列表的NULL元素

时间:2019-03-18 22:53:48

标签: r rcpp

如何使用Rcpp删除简单列表的NULL元素?
或者如何将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 个答案:

答案 0 :(得分:3)

你可以

#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];
}