RCPP сахар уникальный список - PullRequest
0 голосов
/ 30 января 2019

У меня есть список числового вектора, и мне нужен список уникальных элементов.Я попробовал 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-linx_64-gnu-1.0.0 / sourcecpp_272635d5289 / sourceCpp_10.so: неопределенный символ: _ZNK4Rcpp5sugar9IndexHashILi19EE8get_addrEP7SEXPREC

Ответы [ 3 ]

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

Даже если не найдена соответствующая сахарная функция Rcpp, вы можете вызывать R-функции из C ++.Пример:

#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);
}
0 голосов
/ 31 января 2019

Спасибо, что проявили интерес к этой проблеме.Как я уже уведомил, мой 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 большой.Я уверен, что кто-то может оптимизировать этот код.

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

Неясно, что вы делаете неправильно, и это неполный / невоспроизводимый вопрос.

Но есть модульный тест, который делает то, что вы делаете, и мы можем сделать это вручную:

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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...