List 唯一的 rcpp 糖

Rcpp sugar unique of List

我有一个数值向量列表,我需要一个唯一元素列表。我尝试了 Rcpp:unique 功能。它适用于 Numeric Vector 但不适用于 List 时效果很好。这是我得到的代码和错误。

List h(List x){
  return Rcpp::unique(x);
}

Error in dyn.load("/tmp/RtmpDdKvcH/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_272635d5289/sourceCpp_10.so") : unable to load shared object '/tmp/RtmpDdKvcH/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_272635d5289/sourceCpp_10.so': /tmp/RtmpDdKvcH/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_272635d5289/sourceCpp_10.so: undefined symbol: _ZNK4Rcpp5sugar9IndexHashILi19EE8get_addrEP7SEXPREC

不清楚你做错了什么,这是一个不完整/不可重现的问题。

但是有一个单元测试可以完成您所做的,我们也可以手动完成:

R> Rcpp::cppFunction("NumericVector uq(NumericVector x) { return Rcpp::unique(x); }")
R> uq(c(1.1, 2.2, 2.2, 3.3, 27))
[1] 27.0  1.1  3.3  2.2
R> 

即使没有匹配的 Rcpp 糖函数,您也可以从 C++ 中调用 R 函数。示例:

#include <Rcpp.h>
using namespace Rcpp;

Rcpp::Environment base("package:base");
Function do_unique = base["unique"];

// [[Rcpp::export]]
List myfunc(List x) {
  return do_unique(x);
}

感谢您对此问题感兴趣。 正如我所通知的那样,我的 List 仅包含 NumericVector。我建议这段代码比 R 中的 unique 函数运行得更好、更快。然而,当列表很大时,它的效率会降低。也许这可以帮助某人。而且,有人还可以优化这段代码。

List uniqueList(List& x) {
  int xsize = x.size();

  List xunique(x);
  int s = 1;
  for(int i(1); i<xsize; ++i){
    NumericVector xi = x[i];
    int l = 0;
    for(int j(0); j<s; ++j){
      NumericVector xj = x[j];

      int xisize = xi.size();
      int xjsize = xj.size();
      if(xisize != xjsize){
        ++l;
      }
      else{
        if((sum(xi == xj) == xisize)){
          goto notkeep;
        }
        else{
          ++l;
        }
      }
    }

    if(l == s){
      xunique[s] = xi;
      ++s;
    }

    notkeep: 0;
  }
  return head(xunique, s);
}

/***R
x <- list(1,42, 1, 1:3, 42)
uniqueList(x)
[[1]]
[1] 1

[[2]]
[1] 42

[[3]]
[1] 1 2 3


microbenchmark::microbenchmark(uniqueList(x), unique(x))
Unit: microseconds
         expr   min    lq    mean    median  uq    max    neval
 uniqueList(x) 2.382 2.633  3.05103  2.720 2.8995 29.307   100
 unique(x)      2.864 3.110 3.50900  3.254 3.4145 24.039   100

但是 R 函数在 List 较大时变得更快。我相信有人可以优化这段代码。