列表中唯一的Rcpp糖

时间:2019-01-30 18:38:11

标签: rcpp

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

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

dyn.load中的错误(“ /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':     /tmp/RtmpDdKvcH/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_272635d5289/sourceCpp_10.so:未定义符号:_ZNK4Rcpp5sugar9IndexHashILi19EE8get_addrEP7SEXPREC

3 个答案:

答案 0 :(得分:0)

目前尚不清楚您在做什么错,这是一个不完整/无法再现的问题。

但是有一个单元测试可以完成您的工作,我们也可以手动进行:

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> 

答案 1 :(得分:0)

即使没有匹配的Rcpp sugar函数,也可以从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);
}

答案 2 :(得分:0)

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

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函数将变得更快。我确信有人可以优化此代码。